diff --git a/ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesEstimateController.java b/ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesEstimateController.java index f89254f2..c6a6a39c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesEstimateController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesEstimateController.java @@ -138,7 +138,7 @@ public class SalesEstimateController extends BaseController @ResponseBody public AjaxResult engineeringAddSave(@RequestBody SalesEstimate salesEstimate) { - return toAjax(salesEstimateService.insertSalesEstimate(salesEstimate)); + return toAjax(salesEstimateService.engineeringAddSalesEstimate(salesEstimate)); } @@ -155,6 +155,19 @@ public class SalesEstimateController extends BaseController return getDataTable(list); } + /** + * 销售估价详情子表物料数据集合展示 + */ + @ResponseBody + @PostMapping("/getEstimateDetailMaterialList") + public TableDataInfo getEstimateDetailMaterialList(@RequestParam("estimateDetailId") Long estimateDetailId ) + { + startPage(); + List list = estimateDetailMaterialService.getEstimateDetailMaterialList(estimateDetailId); + return getDataTable(list); + } + + /** * 加载新增销售估价-工程 子表物料选择弹窗 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SalesEstimateDetailMaterialMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SalesEstimateDetailMaterialMapper.java index 15b85426..5c647d36 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SalesEstimateDetailMaterialMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SalesEstimateDetailMaterialMapper.java @@ -84,4 +84,12 @@ public interface SalesEstimateDetailMaterialMapper * @return 结果 */ public int restoreSalesEstimateDetailMaterialById(Long estimateDetailMaterialId); + + /** + * 根据estimateDetailId查询详情物料价格 + * + * @param estimateDetailId 销售估价详情物料价格ID + * @return 结果 + */ + List selectDetailMaterialListByEstimateDetailId(Long estimateDetailId); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesEstimateDetailMaterialService.java b/ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesEstimateDetailMaterialService.java index 21da7f1c..dc6f40ed 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesEstimateDetailMaterialService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesEstimateDetailMaterialService.java @@ -81,4 +81,11 @@ public interface ISalesEstimateDetailMaterialService * @return */ int insertEstimateDetailMaterialList(SalesEstimateDetail salesEstimateDetail); + + /** + * 根据销售估价详情ID获取销售估价详情物料价格集合 + * @param estimateDetailId 销售估价详情ID + * @return + */ + List getEstimateDetailMaterialList(Long estimateDetailId); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesEstimateService.java b/ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesEstimateService.java index 3f04d04b..108ea7a7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesEstimateService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesEstimateService.java @@ -80,4 +80,10 @@ public interface ISalesEstimateService */ SalesEstimateDetailVo getSalesEstimateDetailVo(); + /** + * 工程添加销售估价 + * @param salesEstimate + * @return + */ + int engineeringAddSalesEstimate(SalesEstimate salesEstimate); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateDetailMaterialServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateDetailMaterialServiceImpl.java index 00839f09..be5b73e8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateDetailMaterialServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateDetailMaterialServiceImpl.java @@ -48,6 +48,19 @@ public class SalesEstimateDetailMaterialServiceImpl implements ISalesEstimateDet return salesEstimateDetailMaterialMapper.selectSalesEstimateDetailMaterialList(salesEstimateDetailMaterial); } + /** + * 查询销售估价详情物料价格列表 + * + * @param estimateDetailId 销售估价详情物料价格ID + * @return 销售估价详情物料价格 + */ + @Override + public List getEstimateDetailMaterialList(Long estimateDetailId) { + + return salesEstimateDetailMaterialMapper.selectDetailMaterialListByEstimateDetailId(estimateDetailId); + + } + /** * 新增销售估价详情物料价格 * @@ -97,6 +110,7 @@ public class SalesEstimateDetailMaterialServiceImpl implements ISalesEstimateDet return salesEstimateDetailMaterialMapper.insertSalesEstimateDetailMaterialBatch(salesEstimateDetailMaterialList); } + /** * 删除销售估价详情物料价格对象 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateServiceImpl.java index 68d6f19c..f9387a8d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateServiceImpl.java @@ -18,6 +18,7 @@ import com.ruoyi.sales.mapper.SalesEstimateMapper; import com.ruoyi.sales.domain.SalesEstimate; import com.ruoyi.sales.service.ISalesEstimateService; import com.ruoyi.common.core.text.Convert; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; /** @@ -190,4 +191,31 @@ public class SalesEstimateServiceImpl implements ISalesEstimateService salesEstimateDetailVo.setNoTaxMaterialCosts(salesEstimateTemplate.getNoTaxMaterialCosts()); return salesEstimateDetailVo; } + + /** + * 工程添加销售估价 + * + * @param salesEstimate 销售估价 + * @return 结果 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public int engineeringAddSalesEstimate(SalesEstimate salesEstimate) { + + String loginName = ShiroUtils.getLoginName(); + salesEstimate.setUpdateBy(loginName); + salesEstimate.setUpdateTime(new Date()); + salesEstimate.setEstimateStatus("1"); + List salesEstimateDetailList = salesEstimate.getSalesEstimateDetailList(); + for (SalesEstimateDetail salesEstimateDetail : salesEstimateDetailList) { + salesEstimateDetail.setUpdateBy(loginName); + salesEstimateDetail.setUpdateTime(new Date()); + int updateDetailResult = salesEstimateDetailMapper.updateSalesEstimateDetail(salesEstimateDetail); + if (updateDetailResult == 0){ + throw new BusinessException("更新销售估价详情失败"); + } + } + + return salesEstimateMapper.updateSalesEstimate(salesEstimate); + } } diff --git a/ruoyi-admin/src/main/resources/mapper/sales/SalesEstimateDetailMaterialMapper.xml b/ruoyi-admin/src/main/resources/mapper/sales/SalesEstimateDetailMaterialMapper.xml index 648beeba..017dab30 100644 --- a/ruoyi-admin/src/main/resources/mapper/sales/SalesEstimateDetailMaterialMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/sales/SalesEstimateDetailMaterialMapper.xml @@ -40,7 +40,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where estimate_detail_material_id = #{estimateDetailMaterialId} - + + + insert into sales_estimate_detail_material diff --git a/ruoyi-admin/src/main/resources/templates/sales/estimate/engineeringAdd.html b/ruoyi-admin/src/main/resources/templates/sales/estimate/engineeringAdd.html index ea1bcb4a..bcd3e09a 100644 --- a/ruoyi-admin/src/main/resources/templates/sales/estimate/engineeringAdd.html +++ b/ruoyi-admin/src/main/resources/templates/sales/estimate/engineeringAdd.html @@ -7,6 +7,7 @@
+
@@ -118,50 +119,59 @@ return obj; }, {}); + //设置一个标志来跟踪任何错误 + var hasError = false; // 销售估价物料 var estimateMaterialTable = $('#bootstrap-table').bootstrapTable('getData'); - if (estimateMaterialTable.length === 0){ - $.modal.alertWarning("请至少添加一条物料信息"); - return; - } - // 将表数据转换成与estimateData格式一致的数组 var estimateMaterialDataList = estimateMaterialTable.map(function(item) { // 根据实际字段名调整 return { - "materialNo": item.materialNo, - "materialName": item.materialName, - "materialType": item.materialType, - "materialPhotourl": item.materialPhotourl, - "materialDescribe": item.materialDescribe, - "materialBrand": item.materialBrand, - "materialUnit": item.materialUnit, - "materialProcessMethod": item.materialProcessMethod, - "materialGearPosition": item.materialGearPosition, - "materialNum":item.materialNum, - "noTaxRmb": item.noTaxRmb, - "taxRmb": item.taxRmb, - "allNoTaxRmb": item.allNoTaxRmb, - "allTaxRmb": item.allTaxRmb, - "noTaxDollar": item.noTaxDollar, - "taxDollar": item.taxDollar, - "allNoTaxDollar": item.allNoTaxDollar, - "allTaxDollar": item.allTaxDollar, - "warehouseDept": item.warehouseDept, + "estimateDetailId": item.estimateDetailId, + "noTaxDevelopCosts": null, // 初始化为 null 或 0 + "noTaxShippingCosts": null, + "noTaxServiceCosts": null, // ...其他字段 }; }); - // 获取料号档位的最新值 - $('.form-control[id^="materialGearPosition_"]').each(function() { - const index = $(this).attr('id').match(/materialGearPosition_(\d+)/)[1]; // 提取索引 - const value = $(this).val(); // 获取下拉框的值 - estimateMaterialDataList[index].materialGearPosition = value; // 更新料号档位 + $('.form-inline[data-index]').each(function () { + var index = $(this).data('index'); // 获取数据索引 + var noTaxDevelopCosts = $('#noTaxDevelopCosts' + index).val(); + var noTaxShippingCosts = $('#noTaxShippingCosts' + index).val(); + var noTaxServiceCosts = $('#noTaxServiceCosts' + index).val(); + + // 检查成本值是否为空或仅为0 + if (!noTaxDevelopCosts && noTaxDevelopCosts !== '0') { + $.modal.alertWarning("开发成本不能为空,请填写第 " + (parseInt(index) + 1) + " 行的开发成本"); + hasError = true; + return; // 退出循环,阻止进一步处理 + } + if (!noTaxShippingCosts && noTaxShippingCosts !== '0') { + $.modal.alertWarning("运输成本不能为空,请填写第 " + (parseInt(index) + 1) + " 行的运输成本"); + hasError = true; + return; // 退出循环,阻止进一步处理 + } + if (!noTaxServiceCosts && noTaxServiceCosts !== '0') { + $.modal.alertWarning("服务成本不能为空,请填写第 " + (parseInt(index) + 1) + " 行的服务成本"); + hasError = true; + return; // 退出循环,阻止进一步处理 + } + + + // 更新 estimateMaterialDataList 中对应的记录 + estimateMaterialDataList[index].noTaxDevelopCosts = noTaxDevelopCosts; + estimateMaterialDataList[index].noTaxShippingCosts = noTaxShippingCosts; + estimateMaterialDataList[index].noTaxServiceCosts = noTaxServiceCosts; }); + if (hasError) { + return; // 存在错误,阻止提交 + } + const combinedData = Object.assign({}, estimateData, { salesEstimateDetailList: estimateMaterialDataList, }); @@ -170,7 +180,7 @@ // 使用 JSON.stringify() 序列化数据 const jsonData = JSON.stringify(combinedData); // 发送 AJAX 请求到后端接口 - $.operate.saveJson(prefix + "/add", jsonData); + $.operate.saveJson(prefix + "/engineeringAdd", jsonData); } } @@ -316,15 +326,12 @@ var childTableId = 'child_table_'+index; $detail.html('
'); $('#'+childTableId).bootstrapTable({ - url: prefix + "/showAftersalesShippingDeviceListTwo", + url: prefix + "/getEstimateDetailMaterialList", method: 'post', sidePagination: "server", contentType: "application/x-www-form-urlencoded", queryParams : { - // salesOrderCode: warehouseOutOrder.salesOrderCode, - materialNo: parentRow.materialNo, - salesOrderCode:warehouseOutOrder.salesOrderCode, - makeNo:warehouseOutOrder.makeNo + estimateDetailId:parentRow.estimateDetailId }, columns: [ { @@ -366,10 +373,19 @@ }); // 动态生成 form 表单 - var formHtml = ''; + var formHtml = ''; + formHtml += '

运输、服务、开发成本

'; + formHtml += '
'; + formHtml += ''; + formHtml += ''; + formHtml += '
'; + formHtml += '
'; + formHtml += ''; + formHtml += ''; + formHtml += '
'; formHtml += '
'; - formHtml += ''; - formHtml += ''; + formHtml += ''; + formHtml += ''; formHtml += '
'; formHtml += ''; @@ -386,7 +402,13 @@ function queryParams(params) { } - + // 假设这是一个方法,用于获取所有展开行的索引 + function getExpandedRowsIndexes() { + var rows = $('#bootstrap-table').bootstrapTable('getSelections'); + return rows.map(function(row, index) { + return index; // 这里假设 index 是在 `onExpandRow` 中设置的 + }); + } // 逻辑删除前端的一行数据