feat: 路由跳转重构 + 甲方报价单 + 物料分类 + 比价选择方案 + 规格型号拆分

- 比价页改为列表→路由跳转到 comparison/detail,支持勾选物料行生成采购方案PDF
- 新增甲方报价单模块(clientquote):列表+详情路由,含成本价/报价/毛利率,导出PDF
- 新增物料分类管理(category):树形结构,CRUD,物料页面关联分类筛选
- BizMaterial 拆分 spec(规格) + modelNo(型号) 两个字段
- Logo 修复:新PNG + 内联样式确保完整显示
- sys_menu 新增 2012(物料分类)、2013(甲方报价单)、2014(报价单详情)、2015(比价详情)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-23 13:49:11 +08:00
parent 608ee0ed61
commit 54a421aa36
25 changed files with 1614 additions and 502 deletions

View File

@@ -0,0 +1,44 @@
package com.ruoyi.web.controller.bid;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.system.domain.bid.BizClientQuote;
import com.ruoyi.system.service.bid.IBizClientQuoteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/bid/clientquote")
public class BizClientQuoteController extends BaseController {
@Autowired private IBizClientQuoteService service;
@GetMapping("/list")
public TableDataInfo list(BizClientQuote query) {
startPage();
List<BizClientQuote> list = service.selectClientQuoteList(query);
return getDataTable(list);
}
@GetMapping("/{quoteId}")
public AjaxResult getInfo(@PathVariable Long quoteId) {
return success(service.selectClientQuoteById(quoteId));
}
@PostMapping
public AjaxResult add(@RequestBody BizClientQuote quote) {
quote.setCreateBy(getUsername());
return toAjax(service.insertClientQuote(quote));
}
@PutMapping
public AjaxResult edit(@RequestBody BizClientQuote quote) {
return toAjax(service.updateClientQuote(quote));
}
@DeleteMapping("/{quoteId}")
public AjaxResult remove(@PathVariable Long quoteId) {
return toAjax(service.deleteClientQuoteById(quoteId));
}
}

View File

@@ -0,0 +1,38 @@
package com.ruoyi.web.controller.bid;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain.bid.BizMaterialCategory;
import com.ruoyi.system.service.bid.IBizMaterialCategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/bid/category")
public class BizMaterialCategoryController extends BaseController {
@Autowired private IBizMaterialCategoryService service;
@GetMapping("/tree")
public AjaxResult tree() { return success(service.selectCategoryList()); }
@GetMapping("/list")
public AjaxResult list() { return success(service.selectCategoryList()); }
@PostMapping
public AjaxResult add(@RequestBody BizMaterialCategory cat) {
cat.setCreateBy(getUsername());
return toAjax(service.insertCategory(cat));
}
@PutMapping
public AjaxResult edit(@RequestBody BizMaterialCategory cat) {
return toAjax(service.updateCategory(cat));
}
@DeleteMapping("/{categoryId}")
public AjaxResult remove(@PathVariable Long categoryId) {
return toAjax(service.deleteCategory(categoryId));
}
}