From 54a421aa368536855a03130f2fff3ddc1613f1c6 Mon Sep 17 00:00:00 2001 From: wangyu <823267011@qq.com> Date: Sat, 23 May 2026 13:49:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B7=AF=E7=94=B1=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?=E9=87=8D=E6=9E=84=20+=20=E7=94=B2=E6=96=B9=E6=8A=A5=E4=BB=B7?= =?UTF-8?q?=E5=8D=95=20+=20=E7=89=A9=E6=96=99=E5=88=86=E7=B1=BB=20+=20?= =?UTF-8?q?=E6=AF=94=E4=BB=B7=E9=80=89=E6=8B=A9=E6=96=B9=E6=A1=88=20+=20?= =?UTF-8?q?=E8=A7=84=E6=A0=BC=E5=9E=8B=E5=8F=B7=E6=8B=86=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 比价页改为列表→路由跳转到 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 --- .../bid/BizClientQuoteController.java | 44 ++ .../bid/BizMaterialCategoryController.java | 38 ++ .../system/domain/bid/BizClientQuote.java | 57 ++ .../system/domain/bid/BizClientQuoteItem.java | 43 ++ .../ruoyi/system/domain/bid/BizMaterial.java | 3 + .../domain/bid/BizMaterialCategory.java | 38 ++ .../mapper/bid/BizClientQuoteMapper.java | 18 + .../mapper/bid/BizMaterialCategoryMapper.java | 13 + .../service/bid/IBizClientQuoteService.java | 12 + .../bid/IBizMaterialCategoryService.java | 11 + .../bid/impl/BizClientQuoteServiceImpl.java | 88 +++ .../impl/BizMaterialCategoryServiceImpl.java | 58 ++ .../mapper/bid/BizClientQuoteMapper.xml | 62 +++ .../mapper/bid/BizMaterialCategoryMapper.xml | 34 ++ .../mapper/bid/BizMaterialMapper.xml | 13 +- ruoyi-ui/src/api/bid/category.js | 7 + ruoyi-ui/src/api/bid/clientquote.js | 7 + ruoyi-ui/src/assets/logo/logo.png | Bin 1716 -> 355 bytes .../src/layout/components/Sidebar/Logo.vue | 34 +- ruoyi-ui/src/views/bid/category/index.vue | 120 ++++ ruoyi-ui/src/views/bid/clientquote/detail.vue | 350 ++++++++++++ ruoyi-ui/src/views/bid/clientquote/index.vue | 113 ++++ ruoyi-ui/src/views/bid/comparison/detail.vue | 341 ++++++++++++ ruoyi-ui/src/views/bid/comparison/index.vue | 523 +++--------------- ruoyi-ui/src/views/bid/material/index.vue | 89 ++- 25 files changed, 1614 insertions(+), 502 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizClientQuoteController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizMaterialCategoryController.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizClientQuote.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizClientQuoteItem.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizMaterialCategory.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizClientQuoteMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizMaterialCategoryMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizClientQuoteService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizMaterialCategoryService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizClientQuoteServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizMaterialCategoryServiceImpl.java create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizClientQuoteMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizMaterialCategoryMapper.xml create mode 100644 ruoyi-ui/src/api/bid/category.js create mode 100644 ruoyi-ui/src/api/bid/clientquote.js create mode 100644 ruoyi-ui/src/views/bid/category/index.vue create mode 100644 ruoyi-ui/src/views/bid/clientquote/detail.vue create mode 100644 ruoyi-ui/src/views/bid/clientquote/index.vue create mode 100644 ruoyi-ui/src/views/bid/comparison/detail.vue diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizClientQuoteController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizClientQuoteController.java new file mode 100644 index 00000000..d8d8f3fa --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizClientQuoteController.java @@ -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 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)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizMaterialCategoryController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizMaterialCategoryController.java new file mode 100644 index 00000000..c94e20ce --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizMaterialCategoryController.java @@ -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)); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizClientQuote.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizClientQuote.java new file mode 100644 index 00000000..e4b075c8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizClientQuote.java @@ -0,0 +1,57 @@ +package com.ruoyi.system.domain.bid; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +public class BizClientQuote { + private Long quoteId; + private Long tenantId; + private String quoteNo; + private String clientName; + private Long rfqId; + private String rfqNo; + private String rfqTitle; + private String status; + private Date validityDate; + private BigDecimal totalAmount; + private String currency; + private String remark; + private String createBy; + private Date createTime; + private Date updateTime; + private List items; + + public Long getQuoteId(){return quoteId;} + public void setQuoteId(Long v){quoteId=v;} + public Long getTenantId(){return tenantId;} + public void setTenantId(Long v){tenantId=v;} + public String getQuoteNo(){return quoteNo;} + public void setQuoteNo(String v){quoteNo=v;} + public String getClientName(){return clientName;} + public void setClientName(String v){clientName=v;} + public Long getRfqId(){return rfqId;} + public void setRfqId(Long v){rfqId=v;} + public String getRfqNo(){return rfqNo;} + public void setRfqNo(String v){rfqNo=v;} + public String getRfqTitle(){return rfqTitle;} + public void setRfqTitle(String v){rfqTitle=v;} + public String getStatus(){return status;} + public void setStatus(String v){status=v;} + public Date getValidityDate(){return validityDate;} + public void setValidityDate(Date v){validityDate=v;} + public BigDecimal getTotalAmount(){return totalAmount;} + public void setTotalAmount(BigDecimal v){totalAmount=v;} + public String getCurrency(){return currency;} + public void setCurrency(String v){currency=v;} + public String getRemark(){return remark;} + public void setRemark(String v){remark=v;} + public String getCreateBy(){return createBy;} + public void setCreateBy(String v){createBy=v;} + public Date getCreateTime(){return createTime;} + public void setCreateTime(Date v){createTime=v;} + public Date getUpdateTime(){return updateTime;} + public void setUpdateTime(Date v){updateTime=v;} + public List getItems(){return items;} + public void setItems(List v){items=v;} +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizClientQuoteItem.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizClientQuoteItem.java new file mode 100644 index 00000000..6c930095 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizClientQuoteItem.java @@ -0,0 +1,43 @@ +package com.ruoyi.system.domain.bid; + +import java.math.BigDecimal; + +public class BizClientQuoteItem { + private Long itemId; + private Long quoteId; + private String materialName; + private String spec; + private String modelNo; + private String unit; + private BigDecimal quantity; + private BigDecimal costPrice; + private BigDecimal unitPrice; + private BigDecimal totalPrice; + private Integer deliveryDays; + private String remark; + + public Long getItemId(){return itemId;} + public void setItemId(Long v){itemId=v;} + public Long getQuoteId(){return quoteId;} + public void setQuoteId(Long v){quoteId=v;} + public String getMaterialName(){return materialName;} + public void setMaterialName(String v){materialName=v;} + public String getSpec(){return spec;} + public void setSpec(String v){spec=v;} + public String getModelNo(){return modelNo;} + public void setModelNo(String v){modelNo=v;} + public String getUnit(){return unit;} + public void setUnit(String v){unit=v;} + public BigDecimal getQuantity(){return quantity;} + public void setQuantity(BigDecimal v){quantity=v;} + public BigDecimal getCostPrice(){return costPrice;} + public void setCostPrice(BigDecimal v){costPrice=v;} + public BigDecimal getUnitPrice(){return unitPrice;} + public void setUnitPrice(BigDecimal v){unitPrice=v;} + public BigDecimal getTotalPrice(){return totalPrice;} + public void setTotalPrice(BigDecimal v){totalPrice=v;} + public Integer getDeliveryDays(){return deliveryDays;} + public void setDeliveryDays(Integer v){deliveryDays=v;} + public String getRemark(){return remark;} + public void setRemark(String v){remark=v;} +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizMaterial.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizMaterial.java index 599d09d1..919ced33 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizMaterial.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizMaterial.java @@ -9,6 +9,7 @@ public class BizMaterial extends BaseEntity { private String materialCode; private String materialName; private String spec; + private String modelNo; private String unit; private String brand; private String description; @@ -28,6 +29,8 @@ public class BizMaterial extends BaseEntity { public void setMaterialName(String materialName) { this.materialName = materialName; } public String getSpec() { return spec; } public void setSpec(String spec) { this.spec = spec; } + public String getModelNo() { return modelNo; } + public void setModelNo(String modelNo) { this.modelNo = modelNo; } public String getUnit() { return unit; } public void setUnit(String unit) { this.unit = unit; } public String getBrand() { return brand; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizMaterialCategory.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizMaterialCategory.java new file mode 100644 index 00000000..e34666f8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizMaterialCategory.java @@ -0,0 +1,38 @@ +package com.ruoyi.system.domain.bid; + +import java.util.Date; +import java.util.List; + +public class BizMaterialCategory { + private Long categoryId; + private Long tenantId; + private String categoryName; + private Long parentId; + private String ancestors; + private Integer sort; + private String status; + private String createBy; + private Date createTime; + private List children; + + public Long getCategoryId(){return categoryId;} + public void setCategoryId(Long v){categoryId=v;} + public Long getTenantId(){return tenantId;} + public void setTenantId(Long v){tenantId=v;} + public String getCategoryName(){return categoryName;} + public void setCategoryName(String v){categoryName=v;} + public Long getParentId(){return parentId;} + public void setParentId(Long v){parentId=v;} + public String getAncestors(){return ancestors;} + public void setAncestors(String v){ancestors=v;} + public Integer getSort(){return sort;} + public void setSort(Integer v){sort=v;} + public String getStatus(){return status;} + public void setStatus(String v){status=v;} + public String getCreateBy(){return createBy;} + public void setCreateBy(String v){createBy=v;} + public Date getCreateTime(){return createTime;} + public void setCreateTime(Date v){createTime=v;} + public List getChildren(){return children;} + public void setChildren(List v){children=v;} +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizClientQuoteMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizClientQuoteMapper.java new file mode 100644 index 00000000..86932167 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizClientQuoteMapper.java @@ -0,0 +1,18 @@ +package com.ruoyi.system.mapper.bid; + +import com.ruoyi.system.domain.bid.BizClientQuote; +import com.ruoyi.system.domain.bid.BizClientQuoteItem; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +public interface BizClientQuoteMapper { + List selectClientQuoteList(@Param("q") BizClientQuote query); + BizClientQuote selectClientQuoteById(@Param("quoteId") Long quoteId); + List selectItemsByQuoteId(@Param("quoteId") Long quoteId); + int insertClientQuote(BizClientQuote quote); + int insertClientQuoteItem(BizClientQuoteItem item); + int updateClientQuote(BizClientQuote quote); + int deleteClientQuoteById(@Param("quoteId") Long quoteId); + int deleteItemsByQuoteId(@Param("quoteId") Long quoteId); + String selectNextQuoteNo(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizMaterialCategoryMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizMaterialCategoryMapper.java new file mode 100644 index 00000000..b0a4ab90 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizMaterialCategoryMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.mapper.bid; + +import com.ruoyi.system.domain.bid.BizMaterialCategory; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +public interface BizMaterialCategoryMapper { + List selectCategoryList(); + BizMaterialCategory selectCategoryById(@Param("categoryId") Long categoryId); + int insertCategory(BizMaterialCategory category); + int updateCategory(BizMaterialCategory category); + int deleteCategory(@Param("categoryId") Long categoryId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizClientQuoteService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizClientQuoteService.java new file mode 100644 index 00000000..1105dc0e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizClientQuoteService.java @@ -0,0 +1,12 @@ +package com.ruoyi.system.service.bid; + +import com.ruoyi.system.domain.bid.BizClientQuote; +import java.util.List; + +public interface IBizClientQuoteService { + List selectClientQuoteList(BizClientQuote query); + BizClientQuote selectClientQuoteById(Long quoteId); + int insertClientQuote(BizClientQuote quote); + int updateClientQuote(BizClientQuote quote); + int deleteClientQuoteById(Long quoteId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizMaterialCategoryService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizMaterialCategoryService.java new file mode 100644 index 00000000..20e6756c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizMaterialCategoryService.java @@ -0,0 +1,11 @@ +package com.ruoyi.system.service.bid; + +import com.ruoyi.system.domain.bid.BizMaterialCategory; +import java.util.List; + +public interface IBizMaterialCategoryService { + List selectCategoryList(); + int insertCategory(BizMaterialCategory category); + int updateCategory(BizMaterialCategory category); + int deleteCategory(Long categoryId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizClientQuoteServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizClientQuoteServiceImpl.java new file mode 100644 index 00000000..b670e374 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizClientQuoteServiceImpl.java @@ -0,0 +1,88 @@ +package com.ruoyi.system.service.bid.impl; + +import com.ruoyi.system.domain.bid.BizClientQuote; +import com.ruoyi.system.domain.bid.BizClientQuoteItem; +import com.ruoyi.system.mapper.bid.BizClientQuoteMapper; +import com.ruoyi.system.service.bid.IBizClientQuoteService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; + +@Service +public class BizClientQuoteServiceImpl implements IBizClientQuoteService { + @Autowired private BizClientQuoteMapper mapper; + + @Override + public List selectClientQuoteList(BizClientQuote query) { + return mapper.selectClientQuoteList(query); + } + + @Override + public BizClientQuote selectClientQuoteById(Long quoteId) { + BizClientQuote q = mapper.selectClientQuoteById(quoteId); + if (q != null) q.setItems(mapper.selectItemsByQuoteId(quoteId)); + return q; + } + + @Override + @Transactional + public int insertClientQuote(BizClientQuote quote) { + if (quote.getQuoteNo() == null || quote.getQuoteNo().isBlank()) { + quote.setQuoteNo(mapper.selectNextQuoteNo()); + } + if (quote.getStatus() == null) quote.setStatus("draft"); + if (quote.getCurrency() == null) quote.setCurrency("CNY"); + // Calculate total + if (quote.getItems() != null) { + BigDecimal total = BigDecimal.ZERO; + for (BizClientQuoteItem item : quote.getItems()) { + if (item.getUnitPrice() != null && item.getQuantity() != null) { + BigDecimal line = item.getUnitPrice().multiply(item.getQuantity()).setScale(2, RoundingMode.HALF_UP); + item.setTotalPrice(line); + total = total.add(line); + } + } + quote.setTotalAmount(total); + } + int rows = mapper.insertClientQuote(quote); + if (quote.getItems() != null) { + for (BizClientQuoteItem item : quote.getItems()) { + item.setQuoteId(quote.getQuoteId()); + mapper.insertClientQuoteItem(item); + } + } + return rows; + } + + @Override + @Transactional + public int updateClientQuote(BizClientQuote quote) { + if (quote.getItems() != null) { + BigDecimal total = BigDecimal.ZERO; + for (BizClientQuoteItem item : quote.getItems()) { + if (item.getUnitPrice() != null && item.getQuantity() != null) { + BigDecimal line = item.getUnitPrice().multiply(item.getQuantity()).setScale(2, RoundingMode.HALF_UP); + item.setTotalPrice(line); + total = total.add(line); + } + } + quote.setTotalAmount(total); + mapper.deleteItemsByQuoteId(quote.getQuoteId()); + for (BizClientQuoteItem item : quote.getItems()) { + item.setQuoteId(quote.getQuoteId()); + mapper.insertClientQuoteItem(item); + } + } + return mapper.updateClientQuote(quote); + } + + @Override + @Transactional + public int deleteClientQuoteById(Long quoteId) { + mapper.deleteItemsByQuoteId(quoteId); + return mapper.deleteClientQuoteById(quoteId); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizMaterialCategoryServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizMaterialCategoryServiceImpl.java new file mode 100644 index 00000000..05606d40 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizMaterialCategoryServiceImpl.java @@ -0,0 +1,58 @@ +package com.ruoyi.system.service.bid.impl; + +import com.ruoyi.system.domain.bid.BizMaterialCategory; +import com.ruoyi.system.mapper.bid.BizMaterialCategoryMapper; +import com.ruoyi.system.service.bid.IBizMaterialCategoryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.*; + +@Service +public class BizMaterialCategoryServiceImpl implements IBizMaterialCategoryService { + @Autowired private BizMaterialCategoryMapper mapper; + + @Override + public List selectCategoryList() { + List all = mapper.selectCategoryList(); + return buildTree(all); + } + + @Override + public int insertCategory(BizMaterialCategory cat) { + if (cat.getParentId() == null) cat.setParentId(0L); + if (cat.getSort() == null) cat.setSort(0); + if (cat.getStatus() == null) cat.setStatus("0"); + // Build ancestors string + if (cat.getParentId() == 0L) { + cat.setAncestors("0"); + } else { + BizMaterialCategory parent = mapper.selectCategoryById(cat.getParentId()); + cat.setAncestors(parent == null ? "0" : parent.getAncestors() + "," + cat.getParentId()); + } + return mapper.insertCategory(cat); + } + + @Override + public int updateCategory(BizMaterialCategory cat) { return mapper.updateCategory(cat); } + + @Override + public int deleteCategory(Long categoryId) { return mapper.deleteCategory(categoryId); } + + private List buildTree(List all) { + Map map = new LinkedHashMap<>(); + for (BizMaterialCategory c : all) map.put(c.getCategoryId(), c); + List roots = new ArrayList<>(); + for (BizMaterialCategory c : all) { + Long pid = c.getParentId() == null ? 0L : c.getParentId(); + if (pid == 0L) { roots.add(c); } + else { + BizMaterialCategory parent = map.get(pid); + if (parent != null) { + if (parent.getChildren() == null) parent.setChildren(new ArrayList<>()); + parent.getChildren().add(c); + } else roots.add(c); + } + } + return roots; + } +} diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizClientQuoteMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizClientQuoteMapper.xml new file mode 100644 index 00000000..12a219a8 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizClientQuoteMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + INSERT INTO biz_client_quote (tenant_id,quote_no,client_name,rfq_id,rfq_no,rfq_title, + status,validity_date,total_amount,currency,remark,create_by,create_time) + VALUES (1,#{quoteNo},#{clientName},#{rfqId},#{rfqNo},#{rfqTitle}, + #{status},#{validityDate},#{totalAmount},#{currency},#{remark},#{createBy},NOW()) + + + + INSERT INTO biz_client_quote_item (quote_id,material_name,spec,model_no,unit,quantity, + cost_price,unit_price,total_price,delivery_days,remark) + VALUES (#{quoteId},#{materialName},#{spec},#{modelNo},#{unit},#{quantity}, + #{costPrice},#{unitPrice},#{totalPrice},#{deliveryDays},#{remark}) + + + + UPDATE biz_client_quote SET client_name=#{clientName},status=#{status}, + validity_date=#{validityDate},total_amount=#{totalAmount}, + currency=#{currency},remark=#{remark},update_time=NOW() + WHERE quote_id=#{quoteId} + + + DELETE FROM biz_client_quote WHERE quote_id=#{quoteId} + DELETE FROM biz_client_quote_item WHERE quote_id=#{quoteId} + diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizMaterialCategoryMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizMaterialCategoryMapper.xml new file mode 100644 index 00000000..978ced5e --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizMaterialCategoryMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + INSERT INTO biz_material_category (tenant_id,category_name,parent_id,ancestors,sort,status,create_by,create_time) + VALUES (1,#{categoryName},#{parentId},#{ancestors},#{sort},#{status},#{createBy},NOW()) + + + + UPDATE biz_material_category + SET category_name=#{categoryName},parent_id=#{parentId},ancestors=#{ancestors}, + sort=#{sort},status=#{status} + WHERE category_id=#{categoryId} + + + + DELETE FROM biz_material_category WHERE category_id=#{categoryId} + + diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizMaterialMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizMaterialMapper.xml index 6ca54002..5eb5298d 100644 --- a/ruoyi-system/src/main/resources/mapper/bid/BizMaterialMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/bid/BizMaterialMapper.xml @@ -9,6 +9,7 @@ + @@ -23,9 +24,10 @@ SELECT m.* FROM biz_material m AND m.tenant_id = #{tenantId} - AND m.material_code LIKE CONCAT('%',#{materialCode},'%') - AND m.material_name LIKE CONCAT('%',#{materialName},'%') - AND m.status = #{status} + AND m.category_id = #{categoryId} + AND m.material_code LIKE CONCAT('%',#{materialCode},'%') + AND m.material_name LIKE CONCAT('%',#{materialName},'%') + AND m.status = #{status} ORDER BY m.material_id DESC @@ -35,8 +37,8 @@ - INSERT INTO biz_material(tenant_id,category_id,material_code,material_name,spec,unit,brand,description,status,create_by,create_time) - VALUES(#{tenantId},#{categoryId},#{materialCode},#{materialName},#{spec},#{unit},#{brand},#{description},#{status},#{createBy},NOW()) + INSERT INTO biz_material(tenant_id,category_id,material_code,material_name,spec,model_no,unit,brand,description,status,create_by,create_time) + VALUES(#{tenantId},#{categoryId},#{materialCode},#{materialName},#{spec},#{modelNo},#{unit},#{brand},#{description},#{status},#{createBy},NOW()) @@ -45,6 +47,7 @@ material_name=#{materialName}, material_code=#{materialCode}, spec=#{spec}, + model_no=#{modelNo}, unit=#{unit}, brand=#{brand}, description=#{description}, diff --git a/ruoyi-ui/src/api/bid/category.js b/ruoyi-ui/src/api/bid/category.js new file mode 100644 index 00000000..07e5ae21 --- /dev/null +++ b/ruoyi-ui/src/api/bid/category.js @@ -0,0 +1,7 @@ +import request from '@/utils/request' +const baseUrl = '/bid/category' +export const getCategoryList = () => request({ url: baseUrl + '/list', method: 'get' }) +export const getCategoryTree = () => request({ url: baseUrl + '/tree', method: 'get' }) +export const addCategory = (data) => request({ url: baseUrl, method: 'post', data }) +export const updateCategory = (data) => request({ url: baseUrl, method: 'put', data }) +export const delCategory = (id) => request({ url: baseUrl + '/' + id, method: 'delete' }) diff --git a/ruoyi-ui/src/api/bid/clientquote.js b/ruoyi-ui/src/api/bid/clientquote.js new file mode 100644 index 00000000..9d4106de --- /dev/null +++ b/ruoyi-ui/src/api/bid/clientquote.js @@ -0,0 +1,7 @@ +import request from '@/utils/request' +const baseUrl = '/bid/clientquote' +export const listClientQuote = (params) => request({ url: baseUrl + '/list', method: 'get', params }) +export const getClientQuote = (id) => request({ url: baseUrl + '/' + id, method: 'get' }) +export const addClientQuote = (data) => request({ url: baseUrl, method: 'post', data }) +export const updateClientQuote = (data) => request({ url: baseUrl, method: 'put', data }) +export const delClientQuote = (id) => request({ url: baseUrl + '/' + id, method: 'delete' }) diff --git a/ruoyi-ui/src/assets/logo/logo.png b/ruoyi-ui/src/assets/logo/logo.png index 62d6ec6a6c8d5b7f98681b09f46b10c442637259..0e1b671d556172527b60dc87c9c86eaa9676610a 100644 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1SEZ8zRh7^VAS$-aSW-r_4dw1-UA98tPbG? zSKi&&`-bZnzh;5HY(v${b_c6zEol}&Ei6Fg3=Wr=&pdzo0cZeDpuuqAiN@iZAo&G$ z4vTCBajIl!Fk?_lLYHn3+N*#r2IC*FSzy|5_ku)&H7kRKCXd6P_4gSVR&W&TmjJ2Y zSi|0+4`RGyWMFu~%6Ng-l%F9%i47zK0S;fkvx8Z?8FrfO|6edA9jFo~n85A8z#stj b`OTB;Ne6V2S1j0g38dW9)z4*}Q$iB}h=fH4 literal 1716 zcmV;l221&gP)00009a7bBm001r{ z001r{0eGc9b^rhdW=TXrRCt{2ow1J{H4ukqQ3~jg2%)5j6zQO*K_X6rL;>BUqom;v zpxq!ULHDpS1Od+**`d+qhic*bvj(kMDz)*jEd zV|#7y9zgT*J%INI*4OsRgd%?q;4fwXPd1Dv8ok_U7TLIT#>(T7E zYq0gpyAkey4A@}H5PIesY&r7h#F=Zb>#BHCWw2$-p9=tMu<0c#lMObVs*lMAn@{Ys zYlB@!C@WkB8($O+UbR-uZ3DEw8FB*zQG->$ZZW$TyHtV(8*D~pO^yt z4W_}CCDPzg!5##_)Bu|`Gbmv90zgWIUA5aoZm^046;9Zq#x!i$lG;`Sw&=UvU?ViT z7tk1kP1ANYGf;zlv+b_6Mj7mR>sx4q!CtoE&~Xh;BQzRw=S#(K*6%x9+Zk>{%x>`$ zQ+KM6kzq@J#02QJKb*8STkAGu#rSgom`su$8RVUsg>8_J)f{Yt99A>14f3+o!#2q2 zQVZK4=L-||1%^XQGRW(N0GkK2K`vJzY<~p+cQGA0)Jv3w?`Z=74@WEP=EP~t#?>om zSJ)2Ch-Yc-piV8jIY{k|#{X+-pExpkCUd(DK-X|)XMt9q$wQ(KEoOFN*X=)`_l35C zKJ$iiK>uwn4$H`7e^)zXmk0Sq2%-bFp4 zpHefs@bCfs>>7wG7|__(K5td zeI^_Q4LiFVcp;u2@?-;$ef9_?hz-E451BZitApAQTv?DMz-|z(Ovu!*9UM>6DBwC7 zaAiX#h7GVSm*ht31;kAiWCqw+lKc`}bqBP=mNM>!P3sviq!W`Rs()xcRazlWssLLL z+&$IrPIPqR(q_y#R^0&&uqDozPZu&WZ0|tqjM*R~z}B9%0r%?|+J2>oHz zsX(4|2cUZ%|1Z7=fJYq8a7pk%J`%ki|Fw6}7+`?YgM4S<_n)$O!K_n*9LZ#V2D%nF zl4X#0dW+2qW*Ow2&e*(Q)~P{`jmehDg_>SMul>5qNoF!IthgLZW~%PL4uKe))n1j- zyyEo&pnD|{*cw}QPXW5O1HMpxpyhJ3$K%iUVY{N{20R`1Lj9bX{a3(;o~XWs zwevRKp!hT6X5)Yzf?V;f3yxhb+6w+ihs*-|NubUr{BW=9?zKaHmJgW}_CN%=WJ}Xg zL#BR&`fvTEBwrc`?Lhs$vb?>o3#>k8c7Nq{$)bk*qPz%H*dfSIGt0q%JINJZpCZz( z;_-6*+5VPv<9(z|;%>R9-a@0T;Agym%myeIc3>-UaWO>k3+VKaf5Z(;Fj%RuW6!K} zWl;Pn-yYZx2hvu+@;&D1X^|IOBy@w-C5IkiUrp;&$K~%s;c|fTa5k)+Y?^4)WX`k7Zv)0&;KRT7j>rh9nj4 zHDmw)|0_`iUqk})ZekgNVM~X*wQ0rcH=-!SmNj2XETi=E{{))g!UZTe;dyKPmkM%h zS@U*gS>pi%e+kzc@ZIG)x7JGKyUD5`PjYa*-s_oOLe~j*MkHg)Cz1NTM65^B$KIsb z#bJZ6EBH7P!0%`pgz{c;3vhiP7U&I&trh=3*tnIjn}IvVV7`$KxuOpv0sV!ip((JN zf;(BP-KdKr??>u+#@OHiX1~bWBwP<^8$)PYVeduicwR36&B7fZZK=ywD{Zq@ow zq$6j%y3YaN0hFDqimiD4Q&6sHrwsr+7BFnwptrBi?CmfT#LD^*|JI5eG9^VIdaWs0s<)6(BR%${x2!&#@!&l zzf-dT=wiE2f8*5MoCJK!8%_Qr0ofwS$hu{uOkO2>PTq<kWfm--7yunRSlNoJrkEQvqwHVw?sol^wxcO28+u)WQ{7KyszyYhyDkfOm_0ZvCnG&0000< KMNUMnLSTa4gf@}@ diff --git a/ruoyi-ui/src/layout/components/Sidebar/Logo.vue b/ruoyi-ui/src/layout/components/Sidebar/Logo.vue index 976bb280..83293c19 100644 --- a/ruoyi-ui/src/layout/components/Sidebar/Logo.vue +++ b/ruoyi-ui/src/layout/components/Sidebar/Logo.vue @@ -1,46 +1,48 @@ - - diff --git a/ruoyi-ui/src/views/bid/category/index.vue b/ruoyi-ui/src/views/bid/category/index.vue new file mode 100644 index 00000000..dab7371b --- /dev/null +++ b/ruoyi-ui/src/views/bid/category/index.vue @@ -0,0 +1,120 @@ + + + diff --git a/ruoyi-ui/src/views/bid/clientquote/detail.vue b/ruoyi-ui/src/views/bid/clientquote/detail.vue new file mode 100644 index 00000000..71298ddc --- /dev/null +++ b/ruoyi-ui/src/views/bid/clientquote/detail.vue @@ -0,0 +1,350 @@ + + + + + diff --git a/ruoyi-ui/src/views/bid/clientquote/index.vue b/ruoyi-ui/src/views/bid/clientquote/index.vue new file mode 100644 index 00000000..fcfa8c7e --- /dev/null +++ b/ruoyi-ui/src/views/bid/clientquote/index.vue @@ -0,0 +1,113 @@ + + + diff --git a/ruoyi-ui/src/views/bid/comparison/detail.vue b/ruoyi-ui/src/views/bid/comparison/detail.vue new file mode 100644 index 00000000..c8a9b56b --- /dev/null +++ b/ruoyi-ui/src/views/bid/comparison/detail.vue @@ -0,0 +1,341 @@ + + + + + diff --git a/ruoyi-ui/src/views/bid/comparison/index.vue b/ruoyi-ui/src/views/bid/comparison/index.vue index 11be3f65..1cdea943 100644 --- a/ruoyi-ui/src/views/bid/comparison/index.vue +++ b/ruoyi-ui/src/views/bid/comparison/index.vue @@ -1,495 +1,96 @@ diff --git a/ruoyi-ui/src/views/bid/material/index.vue b/ruoyi-ui/src/views/bid/material/index.vue index bd9431f0..1c89cb90 100644 --- a/ruoyi-ui/src/views/bid/material/index.vue +++ b/ruoyi-ui/src/views/bid/material/index.vue @@ -7,6 +7,12 @@ + + + + + 搜索 重置 @@ -26,35 +32,57 @@ - - - + + + + + - - + - - - - - + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + @@ -68,7 +96,7 @@ - +
@@ -81,22 +109,43 @@