Browse Source

代码补充

yuansh 2 weeks ago
parent
commit
f154710069
37 changed files with 845 additions and 187 deletions
  1. 73 18
      jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IpUtils.java
  2. 137 91
      srm-module-code/src/main/java/org/jeecg/modules/afterCode/controller/AfterComplaintController.java
  3. 17 1
      srm-module-code/src/main/java/org/jeecg/modules/afterCode/entity/AfterComplaint.java
  4. 130 0
      srm-module-code/src/main/java/org/jeecg/modules/afterCode/entity/AfterComplaintProduct.java
  5. 31 0
      srm-module-code/src/main/java/org/jeecg/modules/afterCode/mapper/AfterComplaintProductMapper.java
  6. 16 0
      srm-module-code/src/main/java/org/jeecg/modules/afterCode/mapper/xml/AfterComplaintProductMapper.xml
  7. 22 0
      srm-module-code/src/main/java/org/jeecg/modules/afterCode/service/IAfterComplaintProductService.java
  8. 3 2
      srm-module-code/src/main/java/org/jeecg/modules/afterCode/service/IAfterComplaintService.java
  9. 27 0
      srm-module-code/src/main/java/org/jeecg/modules/afterCode/service/impl/AfterComplaintProductServiceImpl.java
  10. 43 2
      srm-module-code/src/main/java/org/jeecg/modules/afterCode/service/impl/AfterComplaintServiceImpl.java
  11. 13 0
      srm-module-code/src/main/java/org/jeecg/modules/afterCode/vo/AfterComplaintPage.java
  12. 3 2
      srm-module-code/src/main/java/org/jeecg/modules/purCode/controller/PurOrderController.java
  13. 1 1
      srm-module-code/src/main/java/org/jeecg/modules/purCode/controller/PurQuotationSelectionController.java
  14. 2 2
      srm-module-code/src/main/java/org/jeecg/modules/purCode/mapper/xml/PurInquiryFormProductMapper.xml
  15. 3 3
      srm-module-code/src/main/java/org/jeecg/modules/purCode/mapper/xml/PurOrderProductMapper.xml
  16. 2 2
      srm-module-code/src/main/java/org/jeecg/modules/purCode/mapper/xml/PurPurchaseQuotationProductMapper.xml
  17. 10 8
      srm-module-code/src/main/java/org/jeecg/modules/purCode/mapper/xml/PurQuotationSelectionProductMapper.xml
  18. 1 1
      srm-module-code/src/main/java/org/jeecg/modules/purCode/service/IPurPurchaseQuotationProductService.java
  19. 15 0
      srm-module-code/src/main/java/org/jeecg/modules/purCode/service/impl/PurInquiryFormServiceImpl.java
  20. 2 2
      srm-module-code/src/main/java/org/jeecg/modules/purCode/service/impl/PurOrderProductServiceImpl.java
  21. 31 0
      srm-module-code/src/main/java/org/jeecg/modules/purCode/service/impl/PurOrderServiceImpl.java
  22. 13 0
      srm-module-code/src/main/java/org/jeecg/modules/purCode/service/impl/PurPurchaseQuotationServiceImpl.java
  23. 14 1
      srm-module-code/src/main/java/org/jeecg/modules/purCode/service/impl/PurQuotationSelectionServiceImpl.java
  24. 4 0
      srm-module-code/src/main/java/org/jeecg/modules/purCode/vo/PurQuotationSelectionAlert.java
  25. 3 2
      srm-module-code/src/main/java/org/jeecg/modules/saleCode/controller/SaleDeliveryController.java
  26. 67 0
      srm-module-code/src/main/java/org/jeecg/modules/saleCode/controller/SaleInterfaceSyncController.java
  27. 36 11
      srm-module-code/src/main/java/org/jeecg/modules/saleCode/controller/SaleInvoiceController.java
  28. 6 6
      srm-module-code/src/main/java/org/jeecg/modules/saleCode/controller/SaleOrderController.java
  29. 5 4
      srm-module-code/src/main/java/org/jeecg/modules/saleCode/controller/SaleQuotationController.java
  30. 2 0
      srm-module-code/src/main/java/org/jeecg/modules/saleCode/entity/SaleInvoice.java
  31. 2 2
      srm-module-code/src/main/java/org/jeecg/modules/saleCode/mapper/xml/SaleDeliveryDetailsMapper.xml
  32. 3 3
      srm-module-code/src/main/java/org/jeecg/modules/saleCode/mapper/xml/SaleInquiryFormProductMapper.xml
  33. 3 3
      srm-module-code/src/main/java/org/jeecg/modules/saleCode/mapper/xml/SaleOrderProductMapper.xml
  34. 2 2
      srm-module-code/src/main/java/org/jeecg/modules/saleCode/mapper/xml/SaleQuotationProductMapper.xml
  35. 16 0
      srm-module-code/src/main/java/org/jeecg/modules/saleCode/service/impl/SaleInquiryFormServiceImpl.java
  36. 72 18
      srm-module-code/src/main/java/org/jeecg/modules/saleCode/service/impl/SaleInvoiceServiceImpl.java
  37. 15 0
      srm-module-code/src/main/java/org/jeecg/modules/saleCode/service/impl/SaleQuotationServiceImpl.java

+ 73 - 18
jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IpUtils.java

@@ -14,28 +14,28 @@ import java.util.regex.Pattern;
 
 /**
  * IP地址
- * 
+ *
  * @Author scott
  * @email jeecgos@163.com
  * @Date 2019年01月14日
  */
 public class IpUtils {
-	private static Logger logger = LoggerFactory.getLogger(IpUtils.class);
-
-	/**
-	 * 获取IP地址
-	 * 
-	 * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
-	 * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
-	 */
-	public static String getIpAddr(HttpServletRequest request) {
-    	String ip = null;
+    private static Logger logger = LoggerFactory.getLogger(IpUtils.class);
+
+    /**
+     * 获取IP地址
+     * <p>
+     * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
+     * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
+     */
+    public static String getIpAddr(HttpServletRequest request) {
+        String ip = null;
         try {
             ip = request.getHeader("x-forwarded-for");
             if (StringUtils.isEmpty(ip) || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {
                 ip = request.getHeader("Proxy-Client-IP");
             }
-            if (StringUtils.isEmpty(ip) || ip.length() == 0 ||CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {
+            if (StringUtils.isEmpty(ip) || ip.length() == 0 || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {
                 ip = request.getHeader("WL-Proxy-Client-IP");
             }
             if (StringUtils.isEmpty(ip) || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {
@@ -48,11 +48,11 @@ public class IpUtils {
                 ip = request.getRemoteAddr();
             }
         } catch (Exception e) {
-        	logger.error("IPUtils ERROR ", e);
+            logger.error("IPUtils ERROR ", e);
         }
 
-        //logger.info("获取客户端 ip:{} ", ip);
-        // 使用代理,则获取第一个IP地址
+//        logger.info("获取客户端 ip:{} ", ip);
+//         使用代理,则获取第一个IP地址
         if (StringUtils.isNotEmpty(ip) && ip.length() > 15) {
             if (ip.indexOf(",") > 0) {
                 //ip = ip.substring(0, ip.indexOf(","));
@@ -65,13 +65,14 @@ public class IpUtils {
                 }
             }
         }
-        
+
         return ip;
     }
 
 
     /**
      * 判断是否是IP格式
+     *
      * @param ipAddress
      * @return
      */
@@ -81,12 +82,13 @@ public class IpUtils {
         Matcher matcher = pattern.matcher(ipAddress);
         return matcher.matches();
     }
-    
+
     /**
      * 获取服务器上的ip
+     *
      * @return
      */
-    public static String getServerIp(){
+    public static String getServerIp() {
         InetAddress inetAddress = null;
         try {
             inetAddress = InetAddress.getLocalHost();
@@ -98,4 +100,57 @@ public class IpUtils {
         }
         return "";
     }
+
+    //==================================================
+//==================================================
+//==================================================
+    private static final String[] IP_HEADERS = {
+            "X-Forwarded-For",
+            "Proxy-Client-IP",
+            "WL-Proxy-Client-IP",
+            "HTTP_X_FORWARDED_FOR",
+            "HTTP_X_FORWARDED",
+            "HTTP_X_CLUSTER_CLIENT_IP",
+            "HTTP_CLIENT_IP",
+            "HTTP_FORWARDED_FOR",
+            "HTTP_FORWARDED",
+            "HTTP_VIA",
+            "REMOTE_ADDR",
+            "X-Real-IP"
+    };
+
+    public static String getClientIp(HttpServletRequest request) {
+        String ip = null;
+        for (String header : IP_HEADERS) {
+            ip = request.getHeader(header);
+            if (StringUtils.isNotBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
+                break;
+            }
+        }
+
+        if (StringUtils.isBlank(ip)) {
+            ip = request.getRemoteAddr();
+        }
+
+        // 处理X-Forwarded-For多IP情况
+//        if (ip != null && ip.contains(",")) {
+//            ip = ip.split(",")[0].trim();
+//            ip = ip.split(",")[0].trim();
+//        }
+
+        // 处理本地测试情况
+        if ("0:0:0:0:0:0:0:1".equals(ip) || "127.0.0.1".equals(ip)) {
+            ip = getLocalHostIp();
+        }
+
+        return ip;
+    }
+
+    private static String getLocalHostIp() {
+        try {
+            return java.net.InetAddress.getLocalHost().getHostAddress();
+        } catch (Exception e) {
+            return "127.0.0.1";
+        }
+    }
 }

+ 137 - 91
srm-module-code/src/main/java/org/jeecg/modules/afterCode/controller/AfterComplaintController.java

@@ -11,7 +11,11 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.apache.commons.lang.StringUtils;
 import org.checkerframework.checker.units.qual.A;
+import org.jeecg.modules.afterCode.entity.AfterComplaintProduct;
+import org.jeecg.modules.afterCode.service.IAfterComplaintProductService;
 import org.jeecg.modules.baseCode.service.ISerialPatternService;
+import org.jeecg.modules.cuspCode.entity.CuspSupplierProfile;
+import org.jeecg.modules.cuspCode.service.ICuspSupplierProfileService;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
 import org.jeecgframework.poi.excel.def.NormalExcelConstants;
 import org.jeecgframework.poi.excel.entity.ExportParams;
@@ -60,9 +64,13 @@ public class AfterComplaintController {
 	private IAfterComplaintService afterComplaintService;
 	@Autowired
 	private IAfterComplaintShipService afterComplaintShipService;
+	@Autowired
+	private IAfterComplaintProductService afterComplaintProductService;
 	 @Autowired
 	 private ISerialPatternService serialPatternService;
-	
+
+	 @Autowired
+	 private ICuspSupplierProfileService cuspSupplierProfileService;
 	/**
 	 * 分页列表查询
 	 *
@@ -126,7 +134,7 @@ public class AfterComplaintController {
 		}
 
 		afterComplaint.setDeal("未处理");
-		afterComplaintService.saveMain(afterComplaint, afterComplaintPage.getAfterComplaintShipList());
+		afterComplaintService.saveMain(afterComplaint, afterComplaintPage.getAfterComplaintShipList(), afterComplaintPage.getAfterComplaintProductList());
 		return Result.OK("添加成功!");
 	}
 	
@@ -147,14 +155,34 @@ public class AfterComplaintController {
 		if(afterComplaintEntity==null) {
 			return Result.error("未找到对应数据");
 		}
-		if(afterComplaintEntity.getAcceptanceTime() !=null){
-			afterComplaint.setAcceptanceTime(new Date());
+
+		String supplierName = "";
+		if(StringUtils.isNotBlank(afterComplaintPage.getPkSupplier())){
+			for(String o:afterComplaintPage.getPkSupplier().split(",")){
+				CuspSupplierProfile ent = cuspSupplierProfileService.getById(o);
+				if(ent !=null){
+					if(StringUtils.isBlank(supplierName)){
+						supplierName = ent.getName();
+					}else{
+						supplierName = supplierName+","+ent.getName();
+					}
+				}
+			}
+			afterComplaint.setSupplierName(supplierName);
 		}
-		afterComplaint.setDealTime(new Date());
-		LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-		afterComplaint.setDealman(sysUser.getUsername());
 
-		afterComplaintService.updateMain(afterComplaint, afterComplaintPage.getAfterComplaintShipList());
+		if(StringUtils.isNotBlank(afterComplaintPage.getDeal())){
+			if(afterComplaint.getDealTime() == null){
+				afterComplaint.setDealTime(new Date());
+			}
+			LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+			afterComplaint.setDealman(sysUser.getUsername());
+			if(afterComplaint.getAcceptanceTime() == null){
+				afterComplaint.setAcceptanceTime(new Date());
+			}
+		}
+
+		afterComplaintService.updateMain(afterComplaint, afterComplaintPage.getAfterComplaintShipList(), afterComplaintPage.getAfterComplaintProductList());
 		return Result.OK("编辑成功!");
 	}
 	
@@ -368,86 +396,104 @@ public class AfterComplaintController {
 		return Result.OK(afterComplaintShipList);
 	}
 
-    /**
-    * 导出excel
-    *
-    * @param request
-    * @param afterComplaint
-    */
-    @RequiresPermissions("afterCode:after_complaint:exportXls")
-    @RequestMapping(value = "/exportXls")
-    public ModelAndView exportXls(HttpServletRequest request, AfterComplaint afterComplaint) {
-      // Step.1 组装查询条件查询数据
-      QueryWrapper<AfterComplaint> queryWrapper = QueryGenerator.initQueryWrapper(afterComplaint, request.getParameterMap());
-      LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-
-      //配置选中数据查询条件
-      String selections = request.getParameter("selections");
-      if(oConvertUtils.isNotEmpty(selections)) {
-         List<String> selectionList = Arrays.asList(selections.split(","));
-         queryWrapper.in("id",selectionList);
-      }
-      //Step.2 获取导出数据
-      List<AfterComplaint> afterComplaintList = afterComplaintService.list(queryWrapper);
-
-      // Step.3 组装pageList
-      List<AfterComplaintPage> pageList = new ArrayList<AfterComplaintPage>();
-      for (AfterComplaint main : afterComplaintList) {
-          AfterComplaintPage vo = new AfterComplaintPage();
-          BeanUtils.copyProperties(main, vo);
-          List<AfterComplaintShip> afterComplaintShipList = afterComplaintShipService.selectByMainId(main.getId());
-          vo.setAfterComplaintShipList(afterComplaintShipList);
-          pageList.add(vo);
-      }
-
-      // Step.4 AutoPoi 导出Excel
-      ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
-      mv.addObject(NormalExcelConstants.FILE_NAME, "客户投诉列表");
-      mv.addObject(NormalExcelConstants.CLASS, AfterComplaintPage.class);
-      mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("客户投诉数据", "导出人:"+sysUser.getRealname(), "客户投诉"));
-      mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
-      return mv;
-    }
-
-    /**
-    * 通过excel导入数据
-    *
-    * @param request
-    * @param response
-    * @return
-    */
-    @RequiresPermissions("afterCode:after_complaint:importExcel")
-    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
-    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
-      Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
-      for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
-          // 获取上传文件对象
-          MultipartFile file = entity.getValue();
-          ImportParams params = new ImportParams();
-          params.setTitleRows(2);
-          params.setHeadRows(1);
-          params.setNeedSave(true);
-          try {
-              List<AfterComplaintPage> list = ExcelImportUtil.importExcel(file.getInputStream(), AfterComplaintPage.class, params);
-              for (AfterComplaintPage page : list) {
-                  AfterComplaint po = new AfterComplaint();
-                  BeanUtils.copyProperties(page, po);
-                  afterComplaintService.saveMain(po, page.getAfterComplaintShipList());
-              }
-              return Result.OK("文件导入成功!数据行数:" + list.size());
-          } catch (Exception e) {
-              log.error(e.getMessage(),e);
-              return Result.error("文件导入失败:"+e.getMessage());
-          } finally {
-              try {
-                  file.getInputStream().close();
-              } catch (IOException e) {
-                  e.printStackTrace();
-              }
-          }
-      }
-      return Result.OK("文件导入失败!");
-    }
-
-}
+	 /**
+	  * 通过id查询
+	  *
+	  * @param id
+	  * @return
+	  */
+	 //@AutoLog(value = "客户投诉-产品通过主表ID查询")
+	 @ApiOperation(value="客户投诉-产品主表ID查询", notes="客户投诉-产品-通主表ID查询")
+	 @GetMapping(value = "/queryAfterComplaintProductByMainId")
+	 public Result<List<AfterComplaintProduct>> queryAfterComplaintProductListByMainId(@RequestParam(name="id",required=true) String id) {
+		 List<AfterComplaintProduct> afterComplaintProductList = afterComplaintProductService.selectByMainId(id);
+		 return Result.OK(afterComplaintProductList);
+	 }
+
+
+	 /**
+	  * 导出excel
+	  *
+	  * @param request
+	  * @param afterComplaint
+	  */
+	 @RequiresPermissions("afterCode:after_complaint:exportXls")
+	 @RequestMapping(value = "/exportXls")
+	 public ModelAndView exportXls(HttpServletRequest request, AfterComplaint afterComplaint) {
+		 // Step.1 组装查询条件查询数据
+		 QueryWrapper<AfterComplaint> queryWrapper = QueryGenerator.initQueryWrapper(afterComplaint, request.getParameterMap());
+		 LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+		 //配置选中数据查询条件
+		 String selections = request.getParameter("selections");
+		 if(oConvertUtils.isNotEmpty(selections)) {
+			 List<String> selectionList = Arrays.asList(selections.split(","));
+			 queryWrapper.in("id",selectionList);
+		 }
+		 //Step.2 获取导出数据
+		 List<AfterComplaint> afterComplaintList = afterComplaintService.list(queryWrapper);
+
+		 // Step.3 组装pageList
+		 List<AfterComplaintPage> pageList = new ArrayList<AfterComplaintPage>();
+		 for (AfterComplaint main : afterComplaintList) {
+			 AfterComplaintPage vo = new AfterComplaintPage();
+			 BeanUtils.copyProperties(main, vo);
+			 List<AfterComplaintShip> afterComplaintShipList = afterComplaintShipService.selectByMainId(main.getId());
+			 vo.setAfterComplaintShipList(afterComplaintShipList);
+			 List<AfterComplaintProduct> afterComplaintProductList = afterComplaintProductService.selectByMainId(main.getId());
+			 vo.setAfterComplaintProductList(afterComplaintProductList);
+			 pageList.add(vo);
+		 }
+
+		 // Step.4 AutoPoi 导出Excel
+		 ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+		 mv.addObject(NormalExcelConstants.FILE_NAME, "客户投诉列表");
+		 mv.addObject(NormalExcelConstants.CLASS, AfterComplaintPage.class);
+		 mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("客户投诉数据", "导出人:"+sysUser.getRealname(), "客户投诉"));
+		 mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+		 return mv;
+	 }
+
+	 /**
+	  * 通过excel导入数据
+	  *
+	  * @param request
+	  * @param response
+	  * @return
+	  */
+	 @RequiresPermissions("afterCode:after_complaint:importExcel")
+	 @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+	 public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+		 MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+		 Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+		 for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+			 // 获取上传文件对象
+			 MultipartFile file = entity.getValue();
+			 ImportParams params = new ImportParams();
+			 params.setTitleRows(2);
+			 params.setHeadRows(1);
+			 params.setNeedSave(true);
+			 try {
+				 List<AfterComplaintPage> list = ExcelImportUtil.importExcel(file.getInputStream(), AfterComplaintPage.class, params);
+				 for (AfterComplaintPage page : list) {
+					 AfterComplaint po = new AfterComplaint();
+					 BeanUtils.copyProperties(page, po);
+					 afterComplaintService.saveMain(po, page.getAfterComplaintShipList(),page.getAfterComplaintProductList());
+				 }
+				 return Result.OK("文件导入成功!数据行数:" + list.size());
+			 } catch (Exception e) {
+				 log.error(e.getMessage(),e);
+				 return Result.error("文件导入失败:"+e.getMessage());
+			 } finally {
+				 try {
+					 file.getInputStream().close();
+				 } catch (IOException e) {
+					 e.printStackTrace();
+				 }
+			 }
+		 }
+		 return Result.OK("文件导入失败!");
+	 }
+
+
+ }

+ 17 - 1
srm-module-code/src/main/java/org/jeecg/modules/afterCode/entity/AfterComplaint.java

@@ -108,14 +108,17 @@ public class AfterComplaint implements Serializable {
 	/**是否过保(warranty expired)*/
 	@Excel(name = "是否过保(warranty expired)", width = 15)
     @ApiModelProperty(value = "是否过保(warranty expired)")
+    @Dict(dicCode = "yes_or_no")
     private String warrantyExpired;
 	/**实际是否过保(actual warranty expired)*/
 	@Excel(name = "实际是否过保(actual warranty expired)", width = 15)
     @ApiModelProperty(value = "实际是否过保(actual warranty expired)")
+    @Dict(dicCode = "yes_or_no")
     private String actualWarrantyExpired;
 	/**重要等级(Important level)*/
 	@Excel(name = "重要等级(Important level)", width = 15)
     @ApiModelProperty(value = "重要等级(Important level)")
+    @Dict(dicCode = "urgent_level")
     private String importantLevel;
 	/**业务员(salesman)*/
 	@Excel(name = "业务员(salesman)", width = 15)
@@ -129,9 +132,13 @@ public class AfterComplaint implements Serializable {
     @ApiModelProperty(value = "附件(attsch)")
     private String attsch;
 	/**投诉原因(reason)*/
-	@Excel(name = "投诉原因(reason)", width = 15)
+	@Excel(name = "客户投诉原因(reason)", width = 15)
     @ApiModelProperty(value = "投诉原因(reason)")
     private String reason;
+	/**投诉原因(reason)*/
+	@Excel(name = "投诉原因(reason)", width = 15)
+    @ApiModelProperty(value = "投诉原因(reason)")
+    private String reason1;
 
 	/**处理(deal)
      * 未处理
@@ -179,4 +186,13 @@ public class AfterComplaint implements Serializable {
 	/**处理单(对冲的销售订单)*/
     @ApiModelProperty(value = "处理单(对冲的销售订单)")
     private String useOrder;
+
+    /**供应商*/
+    @Excel(name = "供应商", width = 15)
+    @ApiModelProperty(value = "供应商")
+    private String pkSupplier;
+    /**供应商名称*/
+    @Excel(name = "供应商名称", width = 15)
+    @ApiModelProperty(value = "供应商名称")
+    private String supplierName;
 }

+ 130 - 0
srm-module-code/src/main/java/org/jeecg/modules/afterCode/entity/AfterComplaintProduct.java

@@ -0,0 +1,130 @@
+package org.jeecg.modules.afterCode.entity;
+
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import org.jeecg.common.constant.ProvinceCityArea;
+import org.jeecg.common.util.SpringContextUtils;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import java.util.Date;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * @Description: 客户投诉-产品
+ * @Author: jeecg-boot
+ * @Date:   2025-09-11
+ * @Version: V1.0
+ */
+@ApiModel(value="after_complaint_product对象", description="客户投诉-产品")
+@Data
+@TableName("after_complaint_product")
+public class AfterComplaintProduct implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键id*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键id")
+    private String id;
+	/**创建人*/
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+	/**更新人*/
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+	/**更新时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+	/**删除状态(0-正常,1-已删除)*/
+	@Excel(name = "删除状态(0-正常,1-已删除)", width = 15)
+    @ApiModelProperty(value = "删除状态(0-正常,1-已删除)")
+    @TableLogic
+    private Integer delFlag;
+	/**表头主键(客户投诉)*/
+    @ApiModelProperty(value = "表头主键(客户投诉)")
+    private String headId;
+	/**产品id*/
+	@Excel(name = "产品id", width = 15)
+    @ApiModelProperty(value = "产品id")
+    private String productId;
+	/**产品分类*/
+	@Excel(name = "产品分类", width = 15)
+    @ApiModelProperty(value = "产品分类")
+    private String productClass;
+	/**产品编码*/
+	@Excel(name = "产品编码", width = 15)
+    @ApiModelProperty(value = "产品编码")
+    private String productCode;
+	/**产品中文名*/
+	@Excel(name = "产品中文名", width = 15)
+    @ApiModelProperty(value = "产品中文名")
+    private String chineseName;
+	/**产品英文名*/
+	@Excel(name = "产品英文名", width = 15)
+    @ApiModelProperty(value = "产品英文名")
+    private String englishName;
+	/**型号*/
+	@Excel(name = "型号", width = 15)
+    @ApiModelProperty(value = "型号")
+    private String model;
+	/**备件号*/
+	@Excel(name = "备件号", width = 15)
+    @ApiModelProperty(value = "备件号")
+    private String partno;
+	/**图号*/
+	@Excel(name = "图号", width = 15)
+    @ApiModelProperty(value = "图号")
+    private String drawingno;
+	/**订货号*/
+	@Excel(name = "订货号", width = 15)
+    @ApiModelProperty(value = "订货号")
+    private String orderno;
+	/**厂家*/
+	@Excel(name = "厂家", width = 15)
+    @ApiModelProperty(value = "厂家")
+    private String factory;
+	/**质量等级*/
+	@Excel(name = "质量等级", width = 15)
+    @ApiModelProperty(value = "质量等级")
+    private String qualityGrade;
+	/**含税金额(tax amount)*/
+	@Excel(name = "含税金额(tax amount)", width = 15)
+    @ApiModelProperty(value = "含税金额(tax amount)")
+    private java.math.BigDecimal taxAmount;
+	/**所属部门*/
+    @ApiModelProperty(value = "所属部门")
+    private String sysOrgCode;
+	/**含税金额(tax amount)*/
+	@Excel(name = "含税金额(tax amount)", width = 15)
+    @ApiModelProperty(value = "含税金额(tax amount)")
+    private java.math.BigDecimal quantity;
+	/**供应商*/
+	@Excel(name = "供应商", width = 15)
+    @ApiModelProperty(value = "供应商")
+    private String pkSupplier;
+	/**供应商名称*/
+	@Excel(name = "供应商名称", width = 15)
+    @ApiModelProperty(value = "供应商名称")
+    private String supplierName;
+	/**来源*/
+	@Excel(name = "来源", width = 15)
+    @ApiModelProperty(value = "来源")
+    private String sourceId;
+	/**备注*/
+	@Excel(name = "备注", width = 15)
+    @ApiModelProperty(value = "备注")
+    private String remarks;
+}

+ 31 - 0
srm-module-code/src/main/java/org/jeecg/modules/afterCode/mapper/AfterComplaintProductMapper.java

@@ -0,0 +1,31 @@
+package org.jeecg.modules.afterCode.mapper;
+
+import java.util.List;
+import org.jeecg.modules.afterCode.entity.AfterComplaintProduct;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @Description: 客户投诉-产品
+ * @Author: jeecg-boot
+ * @Date:   2025-09-11
+ * @Version: V1.0
+ */
+public interface AfterComplaintProductMapper extends BaseMapper<AfterComplaintProduct> {
+
+	/**
+	 * 通过主表id删除子表数据
+	 *
+	 * @param mainId 主表id
+	 * @return boolean
+	 */
+	public boolean deleteByMainId(@Param("mainId") String mainId);
+
+  /**
+   * 通过主表id查询子表数据
+   *
+   * @param mainId 主表id
+   * @return List<AfterComplaintProduct>
+   */
+	public List<AfterComplaintProduct> selectByMainId(@Param("mainId") String mainId);
+}

+ 16 - 0
srm-module-code/src/main/java/org/jeecg/modules/afterCode/mapper/xml/AfterComplaintProductMapper.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.afterCode.mapper.AfterComplaintProductMapper">
+
+	<delete id="deleteByMainId" parameterType="java.lang.String">
+		DELETE 
+		FROM  after_complaint_product 
+		WHERE
+			 head_id = #{mainId} 	</delete>
+	
+	<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.afterCode.entity.AfterComplaintProduct">
+		SELECT * 
+		FROM  after_complaint_product
+		WHERE
+			 head_id = #{mainId} order by create_time	</select>
+</mapper>

+ 22 - 0
srm-module-code/src/main/java/org/jeecg/modules/afterCode/service/IAfterComplaintProductService.java

@@ -0,0 +1,22 @@
+package org.jeecg.modules.afterCode.service;
+
+import org.jeecg.modules.afterCode.entity.AfterComplaintProduct;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+
+/**
+ * @Description: 客户投诉-产品
+ * @Author: jeecg-boot
+ * @Date:   2025-09-11
+ * @Version: V1.0
+ */
+public interface IAfterComplaintProductService extends IService<AfterComplaintProduct> {
+
+	/**
+	 * 通过主表id查询子表数据
+	 *
+	 * @param mainId 主表id
+	 * @return List<AfterComplaintProduct>
+	 */
+	public List<AfterComplaintProduct> selectByMainId(String mainId);
+}

+ 3 - 2
srm-module-code/src/main/java/org/jeecg/modules/afterCode/service/IAfterComplaintService.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.afterCode.service;
 
+import org.jeecg.modules.afterCode.entity.AfterComplaintProduct;
 import org.jeecg.modules.afterCode.entity.AfterComplaintShip;
 import org.jeecg.modules.afterCode.entity.AfterComplaint;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -21,7 +22,7 @@ public interface IAfterComplaintService extends IService<AfterComplaint> {
 	 * @param afterComplaint
 	 * @param afterComplaintShipList
 	 */
-	public void saveMain(AfterComplaint afterComplaint,List<AfterComplaintShip> afterComplaintShipList) ;
+	public void saveMain(AfterComplaint afterComplaint,List<AfterComplaintShip> afterComplaintShipList,List<AfterComplaintProduct> afterComplaintProductList) ;
 	
 	/**
 	 * 修改一对多
@@ -29,7 +30,7 @@ public interface IAfterComplaintService extends IService<AfterComplaint> {
    * @param afterComplaint
    * @param afterComplaintShipList
 	 */
-	public void updateMain(AfterComplaint afterComplaint,List<AfterComplaintShip> afterComplaintShipList);
+	public void updateMain(AfterComplaint afterComplaint,List<AfterComplaintShip> afterComplaintShipList,List<AfterComplaintProduct> afterComplaintProductList);
 	
 	/**
 	 * 删除一对多

+ 27 - 0
srm-module-code/src/main/java/org/jeecg/modules/afterCode/service/impl/AfterComplaintProductServiceImpl.java

@@ -0,0 +1,27 @@
+package org.jeecg.modules.afterCode.service.impl;
+
+import org.jeecg.modules.afterCode.entity.AfterComplaintProduct;
+import org.jeecg.modules.afterCode.mapper.AfterComplaintProductMapper;
+import org.jeecg.modules.afterCode.service.IAfterComplaintProductService;
+import org.springframework.stereotype.Service;
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @Description: 客户投诉-产品
+ * @Author: jeecg-boot
+ * @Date:   2025-09-11
+ * @Version: V1.0
+ */
+@Service
+public class AfterComplaintProductServiceImpl extends ServiceImpl<AfterComplaintProductMapper, AfterComplaintProduct> implements IAfterComplaintProductService {
+	
+	@Autowired
+	private AfterComplaintProductMapper afterComplaintProductMapper;
+	
+	@Override
+	public List<AfterComplaintProduct> selectByMainId(String mainId) {
+		return afterComplaintProductMapper.selectByMainId(mainId);
+	}
+}

+ 43 - 2
srm-module-code/src/main/java/org/jeecg/modules/afterCode/service/impl/AfterComplaintServiceImpl.java

@@ -1,7 +1,10 @@
 package org.jeecg.modules.afterCode.service.impl;
 
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.afterCode.entity.AfterComplaint;
+import org.jeecg.modules.afterCode.entity.AfterComplaintProduct;
 import org.jeecg.modules.afterCode.entity.AfterComplaintShip;
+import org.jeecg.modules.afterCode.mapper.AfterComplaintProductMapper;
 import org.jeecg.modules.afterCode.mapper.AfterComplaintShipMapper;
 import org.jeecg.modules.afterCode.mapper.AfterComplaintMapper;
 import org.jeecg.modules.afterCode.service.IAfterComplaintService;
@@ -26,10 +29,12 @@ public class AfterComplaintServiceImpl extends ServiceImpl<AfterComplaintMapper,
 	private AfterComplaintMapper afterComplaintMapper;
 	@Autowired
 	private AfterComplaintShipMapper afterComplaintShipMapper;
+	@Autowired
+	private AfterComplaintProductMapper afterComplaintProductMapper;
 	
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void saveMain(AfterComplaint afterComplaint, List<AfterComplaintShip> afterComplaintShipList) {
+	public void saveMain(AfterComplaint afterComplaint, List<AfterComplaintShip> afterComplaintShipList,List<AfterComplaintProduct> afterComplaintProductList) {
 		afterComplaintMapper.insert(afterComplaint);
 		if(afterComplaintShipList!=null && afterComplaintShipList.size()>0) {
 			for(AfterComplaintShip entity:afterComplaintShipList) {
@@ -39,30 +44,65 @@ public class AfterComplaintServiceImpl extends ServiceImpl<AfterComplaintMapper,
 				afterComplaintShipMapper.insert(entity);
 			}
 		}
+		if(afterComplaintProductList!=null && afterComplaintProductList.size()>0) {
+			int i = 0;
+			for(AfterComplaintProduct entity:afterComplaintProductList) {
+				i ++ ;
+				//外键设置
+				entity.setId(null);
+				entity.setCreateTime(DateUtils.getNextTime(i));
+				entity.setUpdateTime(null);
+				entity.setCreateBy(null);
+				entity.setUpdateBy(null);
+
+				entity.setHeadId(afterComplaint.getId());
+				afterComplaintProductMapper.insert(entity);
+			}
+		}
 	}
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void updateMain(AfterComplaint afterComplaint,List<AfterComplaintShip> afterComplaintShipList) {
+	public void updateMain(AfterComplaint afterComplaint,List<AfterComplaintShip> afterComplaintShipList,List<AfterComplaintProduct> afterComplaintProductList) {
 		afterComplaintMapper.updateById(afterComplaint);
 		
 		//1.先删除子表数据
 		afterComplaintShipMapper.deleteByMainId(afterComplaint.getId());
+		//1.先删除子表数据
+		afterComplaintProductMapper.deleteByMainId(afterComplaint.getId());
 		
 		//2.子表数据重新插入
 		if(afterComplaintShipList!=null && afterComplaintShipList.size()>0) {
 			for(AfterComplaintShip entity:afterComplaintShipList) {
 				//外键设置
+				entity.setId(null);
 				entity.setHeadId(afterComplaint.getId());
 				afterComplaintShipMapper.insert(entity);
 			}
 		}
+		if(afterComplaintProductList!=null && afterComplaintProductList.size()>0) {
+			int i = 0;
+			for(AfterComplaintProduct entity:afterComplaintProductList) {
+				//外键设置
+				i ++ ;
+				//外键设置
+				entity.setId(null);
+				entity.setCreateTime(DateUtils.getNextTime(i));
+				entity.setUpdateTime(null);
+				entity.setCreateBy(null);
+				entity.setUpdateBy(null);
+
+				entity.setHeadId(afterComplaint.getId());
+				afterComplaintProductMapper.insert(entity);
+			}
+		}
 	}
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void delMain(String id) {
 		afterComplaintShipMapper.deleteByMainId(id);
+		afterComplaintProductMapper.deleteByMainId(id);
 		afterComplaintMapper.deleteById(id);
 	}
 
@@ -71,6 +111,7 @@ public class AfterComplaintServiceImpl extends ServiceImpl<AfterComplaintMapper,
 	public void delBatchMain(Collection<? extends Serializable> idList) {
 		for(Serializable id:idList) {
 			afterComplaintShipMapper.deleteByMainId(id.toString());
+			afterComplaintProductMapper.deleteByMainId(id.toString());
 			afterComplaintMapper.deleteById(id);
 		}
 	}

+ 13 - 0
srm-module-code/src/main/java/org/jeecg/modules/afterCode/vo/AfterComplaintPage.java

@@ -2,6 +2,7 @@ package org.jeecg.modules.afterCode.vo;
 
 import java.util.List;
 import org.jeecg.modules.afterCode.entity.AfterComplaint;
+import org.jeecg.modules.afterCode.entity.AfterComplaintProduct;
 import org.jeecg.modules.afterCode.entity.AfterComplaintShip;
 import lombok.Data;
 import org.jeecgframework.poi.excel.annotation.Excel;
@@ -175,8 +176,20 @@ public class AfterComplaintPage {
 	@ApiModelProperty(value = "处理单(对冲的销售订单)")
     private String useOrder;
 
+	/**供应商*/
+	@Excel(name = "供应商", width = 15)
+	@ApiModelProperty(value = "供应商")
+	private String pkSupplier;
+	/**供应商名称*/
+	@Excel(name = "供应商名称", width = 15)
+	@ApiModelProperty(value = "供应商名称")
+	private String supplierName;
+
 	@ExcelCollection(name="客户投诉-船明细")
 	@ApiModelProperty(value = "客户投诉-船明细")
 	private List<AfterComplaintShip> afterComplaintShipList;
 
+	@ExcelCollection(name="客户投诉-产品")
+	@ApiModelProperty(value = "客户投诉-产品")
+	private List<AfterComplaintProduct> afterComplaintProductList;
 }

+ 3 - 2
srm-module-code/src/main/java/org/jeecg/modules/purCode/controller/PurOrderController.java

@@ -4,6 +4,7 @@ import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
@@ -957,7 +958,7 @@ public class PurOrderController {
 //                    purOrder.setDiscountHeadText((100 - purOrder.getDiscountHead().doubleValue()) + "%");
                     purOrder.setDiscountHeadText(purOrder.getDiscountHead().doubleValue() + "%");
                     BigDecimal discountAmount = purOrder.getTotalAmount().subtract(purOrder.getDiscountAmount());
-                    purOrder.setDiscountHeadMoney(discountAmount.setScale(2));
+                    purOrder.setDiscountHeadMoney(discountAmount.setScale(2, RoundingMode.HALF_UP));
                 }
 
                 String agreementTerms = purOrder.getAgreementTerms();
@@ -1091,7 +1092,7 @@ public class PurOrderController {
 
                     purOrder.setQualityGrade(productList.get(0).getQualityGrade());
                 }
-                orderMoney = orderMoney.setScale(2);
+                orderMoney = orderMoney.setScale(2, RoundingMode.HALF_UP);
                 purOrder.setOrderMoney(orderMoney);
 
 

+ 1 - 1
srm-module-code/src/main/java/org/jeecg/modules/purCode/controller/PurQuotationSelectionController.java

@@ -123,7 +123,7 @@ public class PurQuotationSelectionController {
 
 
     /**
-     * 采购订单 更换供应商时使用
+     * 采购订单 更换供应商时使用 变更报价
      * @param id 采购订单id
      * @param code 价格选定的单号
      * @param project 项目

+ 2 - 2
srm-module-code/src/main/java/org/jeecg/modules/purCode/mapper/xml/PurInquiryFormProductMapper.xml

@@ -12,7 +12,7 @@
 		SELECT * 
 		FROM  pur_inquiry_form_product
 		WHERE
-			 head_id = #{mainId} 	</select>
+			 head_id = #{mainId} order by create_time asc  	</select>
 
 	<select id="alertPurInquiryList" resultType="org.jeecg.modules.purCode.vo.PurInquiryFormAlert">
 		select *
@@ -50,7 +50,7 @@
 				   and a.submit = 1
 				   and a.status = 0
 				   and b.del_flag = 0
-				   and d.status = 1
+				   and d.status = 1 order by b.create_time asc
 			 ) a
 			${ew.customSqlSegment}
 	</select>

+ 3 - 3
srm-module-code/src/main/java/org/jeecg/modules/purCode/mapper/xml/PurOrderProductMapper.xml

@@ -12,7 +12,7 @@
 		SELECT * 
 		FROM  pur_order_product
 		WHERE
-			 head_id = #{mainId} 	</select>
+			 head_id = #{mainId} order by create_time asc  	</select>
 
 	<select id="selectPurOrderDetailAlert" parameterType="java.lang.String" resultType="org.jeecg.modules.purCode.vo.PurOrderAlert">
 		select *
@@ -52,8 +52,8 @@
 		  and a.status = 1
 		  and a.submit = 1
 		  and b.del_flag = 0
-		  and d.status = 1
-			) a
+		  and d.status = 1 order by b.create_time asc
+			 ) a
 			${ew.customSqlSegment}
 	</select>
 </mapper>

+ 2 - 2
srm-module-code/src/main/java/org/jeecg/modules/purCode/mapper/xml/PurPurchaseQuotationProductMapper.xml

@@ -12,7 +12,7 @@
 		SELECT * 
 		FROM  pur_purchase_quotation_product
 		WHERE
-			 head_id = #{mainId} 	</select>
+			 head_id = #{mainId} order by create_time asc  	</select>
 
 
 	<select id="supplierQuotationDetails" resultType="org.jeecg.modules.purCode.vo.SupplierQuotationDetails">
@@ -56,7 +56,7 @@
 				 where a.del_flag = 0
 				   and a.submit = 1
 				   and b.del_flag = 0
-				   and d.status = 1
+				   and d.status = 1 order by b.create_time asc
 
 			 ) a
 			${ew.customSqlSegment}

+ 10 - 8
srm-module-code/src/main/java/org/jeecg/modules/purCode/mapper/xml/PurQuotationSelectionProductMapper.xml

@@ -10,9 +10,9 @@
 	
 	<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.purCode.entity.PurQuotationSelectionProduct">
 		SELECT * 
-		FROM  pur_quotation_selection_product
+		FROM  pur_quotation_selection_product a
 		WHERE
-			 head_id = #{mainId} 	</select>
+			 a.head_id = #{mainId} order by a.create_time asc 	</select>
 
 
 
@@ -54,16 +54,18 @@
 					  , b.exchange_rate_usd
 					  , b.discount
 					  , b.tax_price_original
-
-				 from pur_quotation_selection a
-						  left join pur_quotation_selection_product b on a.id = b.head_id
-						  left join base_project_archive d on a.inquiry_project = d.id
-
+					,case when e.tax_rate is null then IFNULL(f.tax_rate,0) else e.tax_rate  end as tax_rate
+					,IFNULL(f.gross_margin,0) gross_margin
+					from pur_quotation_selection a
+					left join pur_quotation_selection_product b on a.id = b.head_id
+					left join base_project_archive d on a.inquiry_project = d.id
+					left join base_product_archive e on b.product_id = e.id
+					left join base_product_class f on e.class_id = f.id
 				 where a.del_flag = 0
 				   and a.submit = 1
 				   and b.del_flag = 0
 				   and d.status = 1
-
+				 order by b.create_time asc
 			 ) a
 			${ew.customSqlSegment}
 	</select>

+ 1 - 1
srm-module-code/src/main/java/org/jeecg/modules/purCode/service/IPurPurchaseQuotationProductService.java

@@ -10,7 +10,7 @@ import org.jeecg.modules.purCode.vo.SupplierQuotationDetails;
 import java.util.List;
 
 /**
- * @Description: 采购价单子表 - 产品明细
+ * @Description: 采购价单子表 - 产品明细
  * @Author: jeecg-boot
  * @Date:   2024-11-22
  * @Version: V1.0

+ 15 - 0
srm-module-code/src/main/java/org/jeecg/modules/purCode/service/impl/PurInquiryFormServiceImpl.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.purCode.service.impl;
 
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.purCode.entity.PurInquiryForm;
 import org.jeecg.modules.purCode.entity.PurInquiryFormShip;
 import org.jeecg.modules.purCode.entity.PurInquiryFormProduct;
@@ -44,7 +45,14 @@ public class PurInquiryFormServiceImpl extends ServiceImpl<PurInquiryFormMapper,
 			}
 		}
 		if(purInquiryFormProductList!=null && purInquiryFormProductList.size()>0) {
+			int i = 0;
 			for(PurInquiryFormProduct entity:purInquiryFormProductList) {
+				i ++ ;
+				entity.setCreateTime(DateUtils.getNextTime(i));
+				entity.setUpdateTime(null);
+				entity.setCreateBy(null);
+				entity.setUpdateBy(null);
+
 				//外键设置
 				entity.setId(null);
 				entity.setHeadId(purInquiryForm.getId());
@@ -72,7 +80,14 @@ public class PurInquiryFormServiceImpl extends ServiceImpl<PurInquiryFormMapper,
 			}
 		}
 		if(purInquiryFormProductList!=null && purInquiryFormProductList.size()>0) {
+			int i = 0;
 			for(PurInquiryFormProduct entity:purInquiryFormProductList) {
+				i ++ ;
+				entity.setCreateTime(DateUtils.getNextTime(i));
+				entity.setUpdateTime(null);
+				entity.setCreateBy(null);
+				entity.setUpdateBy(null);
+
 				//外键设置
 				entity.setId(null);
 				entity.setHeadId(purInquiryForm.getId());

+ 2 - 2
srm-module-code/src/main/java/org/jeecg/modules/purCode/service/impl/PurOrderProductServiceImpl.java

@@ -130,7 +130,7 @@ public class PurOrderProductServiceImpl extends ServiceImpl<PurOrderProductMappe
 					if (findPurQuotationSelectionProduct != null){
 						po.setTaxPriceOriginal(findPurQuotationSelectionProduct.getTaxPriceOriginal());
 						BigDecimal discount = findPurQuotationSelectionProduct.getDiscount();
-						String discountText = discount == null ? "": new BigDecimal(100.0 - discount.doubleValue()).setScale(2).toString();
+						String discountText = discount == null ? "": new BigDecimal(100.0 - discount.doubleValue()).setScale(2, RoundingMode.HALF_UP).toString();
 						po.setDiscountText(discountText);
 					}
 				}
@@ -146,7 +146,7 @@ public class PurOrderProductServiceImpl extends ServiceImpl<PurOrderProductMappe
 			if (findPurQuotationSelectionProduct != null) {
 				po.setTaxPriceOriginal(findPurQuotationSelectionProduct.getTaxPriceOriginal());
 				BigDecimal discount = findPurQuotationSelectionProduct.getDiscount();
-				String discountText = discount == null ? "" : new BigDecimal(100.0 - discount.doubleValue()).setScale(2).toString();
+				String discountText = discount == null ? "" : new BigDecimal(100.0 - discount.doubleValue()).setScale(2, RoundingMode.HALF_UP).toString();
 				po.setDiscountText(discountText);
 			}
 		});

+ 31 - 0
srm-module-code/src/main/java/org/jeecg/modules/purCode/service/impl/PurOrderServiceImpl.java

@@ -3,6 +3,7 @@ package org.jeecg.modules.purCode.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.apache.commons.lang.StringUtils;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.baseCode.service.ISerialPatternService;
 import org.jeecg.modules.purCode.entity.PurOrder;
 import org.jeecg.modules.purCode.entity.PurOrderShip;
@@ -65,30 +66,44 @@ public class PurOrderServiceImpl extends ServiceImpl<PurOrderMapper, PurOrder> i
 			if("/saleCode/quotation/quotation".equals(url)){
 				num = purOrderShipMapper.quotationNum();
 				o.setPerms("销售流程");
+				o.setPermsType("quotationNum");
+				o.setComponentName("报价选定>>销售报价单(Sales Quotation)");
 			}
 			if("/saleCode/salesOrder/SaleOrderFormList".equals(url)){
 				num = purOrderShipMapper.SaleOrderFormListNum();
 				o.setPerms("销售流程");
+				o.setPermsType("SaleOrderFormListNum");
+				o.setComponentName("销售报价>>销售订单(Sales Order)");
 			}
 			if("/saleCode/deliveryNotice/deliveryNoticeList".equals(url)){
 				num = purOrderShipMapper.deliveryNoticeListNum();
 				o.setPerms("销售流程");
+				o.setPermsType("deliveryNoticeListNum");
+				o.setComponentName("销售订单>>发货通知单(Delivery Documents)");
 			}
 			if("/purchase/purchaseInquiryForm/purchaseInquiryFormList".equals(url)){
 				num = purOrderShipMapper.purchaseInquiryFormListNum();
 				o.setPerms("采购流程");
+				o.setPermsType("purchaseInquiryFormListNum");
+				o.setComponentName("销售询价>>采购询价单(Create Purchase Inquiry)");
 			}
 			if("/purchase/purchaseQuotationFrm/purchaseQuotationFormList".equals(url)){
 				num = purOrderShipMapper.purchaseQuotationFormListNum();
 				o.setPerms("采购流程");
+				o.setPermsType("purchaseQuotationFormListNum");
+				o.setComponentName("采购询价>>采购报价单(Enter Supplier Quotes)");
 			}
 			if("/purchase/selectionQuotationForm/selectionQuotationFormList".equals(url)){
 				num = purOrderShipMapper.selectionQuotationFormListNum();
 				o.setPerms("采购流程");
+				o.setPermsType("selectionQuotationFormListNum");
+				o.setComponentName("采购报价>>采购报价选定(Price Comparison)");
 			}
 			if("/purchase/purchaseOrder/PurchaseOrderFormList".equals(url)){
 				num = purOrderShipMapper.PurchaseOrderFormListNum();
 				o.setPerms("采购流程");
+				o.setPermsType("PurchaseOrderFormListNum");
+				o.setComponentName("销售订单>>采购订单(Edit/input purchase order)");
 			}
 			o.setDescription(String.valueOf(num));
 		}
@@ -104,6 +119,8 @@ public class PurOrderServiceImpl extends ServiceImpl<PurOrderMapper, PurOrder> i
 		BigDecimal totalAmount = BigDecimal.ZERO;
 		if(purOrderProductList!=null && purOrderProductList.size()>0) {
 			for(PurOrderProduct entity:purOrderProductList) {
+
+
 				BigDecimal amount = entity.getTaxAmount()==null ? BigDecimal.ZERO : entity.getTaxAmount();
 				totalAmount = totalAmount.add(amount);
 			}
@@ -126,7 +143,13 @@ public class PurOrderServiceImpl extends ServiceImpl<PurOrderMapper, PurOrder> i
 			}
 		}
 		if(purOrderProductList!=null && purOrderProductList.size()>0) {
+			int i = 0;
 			for(PurOrderProduct entity:purOrderProductList) {
+				i ++ ;
+				entity.setCreateTime(DateUtils.getNextTime(i));
+				entity.setUpdateTime(null);
+				entity.setCreateBy(null);
+				entity.setUpdateBy(null);
 				//外键设置
 				entity.setId(null);
 				entity.setHeadId(purOrder.getId());
@@ -217,7 +240,14 @@ public class PurOrderServiceImpl extends ServiceImpl<PurOrderMapper, PurOrder> i
 			}
 		}
 		if(purOrderProductList!=null && purOrderProductList.size()>0) {
+			int i = 0;
 			for(PurOrderProduct entity:purOrderProductList) {
+				i ++ ;
+				entity.setCreateTime(DateUtils.getNextTime(i));
+				entity.setUpdateTime(null);
+				entity.setCreateBy(null);
+				entity.setUpdateBy(null);
+
 				//外键设置
 				entity.setId(null);
 				entity.setHeadId(purOrder.getId());
@@ -309,6 +339,7 @@ public class PurOrderServiceImpl extends ServiceImpl<PurOrderMapper, PurOrder> i
 			}
 		}
 		if(purOrderProductList!=null && purOrderProductList.size()>0) {
+
 			for(PurOrderProduct entity:purOrderProductList) {
 				//外键设置
 //				entity.setId(null);

+ 13 - 0
srm-module-code/src/main/java/org/jeecg/modules/purCode/service/impl/PurPurchaseQuotationServiceImpl.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.purCode.service.impl;
 
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.purCode.entity.PurPurchaseQuotation;
 import org.jeecg.modules.purCode.entity.PurPurchaseQuotationShip;
 import org.jeecg.modules.purCode.entity.PurPurchaseQuotationProduct;
@@ -56,7 +57,13 @@ public class PurPurchaseQuotationServiceImpl extends ServiceImpl<PurPurchaseQuot
 			}
 		}
 		if(purPurchaseQuotationProductList !=null && purPurchaseQuotationProductList.size()>0) {
+			int i = 0;
 			for(PurPurchaseQuotationProduct entity: purPurchaseQuotationProductList) {
+				i ++ ;
+				entity.setCreateTime(DateUtils.getNextTime(i));
+				entity.setUpdateTime(null);
+				entity.setCreateBy(null);
+				entity.setUpdateBy(null);
 				//外键设置
 				entity.setHeadId(purPurchaseQuotation.getId());
 				entity.setId(null);
@@ -95,7 +102,13 @@ public class PurPurchaseQuotationServiceImpl extends ServiceImpl<PurPurchaseQuot
 			}
 		}
 		if(purPurchaseQuotationProductList !=null && purPurchaseQuotationProductList.size()>0) {
+			int i = 0;
 			for(PurPurchaseQuotationProduct entity: purPurchaseQuotationProductList) {
+				i ++ ;
+				entity.setCreateTime(DateUtils.getNextTime(i));
+				entity.setUpdateTime(null);
+				entity.setCreateBy(null);
+				entity.setUpdateBy(null);
 				//外键设置
 				entity.setId(null);
 				entity.setHeadId(purPurchaseQuotation.getId());

+ 14 - 1
srm-module-code/src/main/java/org/jeecg/modules/purCode/service/impl/PurQuotationSelectionServiceImpl.java

@@ -2,6 +2,7 @@ package org.jeecg.modules.purCode.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import io.micrometer.core.instrument.util.StringUtils;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.purCode.entity.*;
 import org.jeecg.modules.purCode.mapper.*;
 import org.jeecg.modules.purCode.service.IPurQuotationSelectionService;
@@ -76,7 +77,13 @@ public class PurQuotationSelectionServiceImpl extends ServiceImpl<PurQuotationSe
         BigDecimal totalAmountUsd = BigDecimal.ZERO;
 
         if (purQuotationSelectionProductList != null && purQuotationSelectionProductList.size() > 0) {
+            int i = 0;
             for (PurQuotationSelectionProduct entity : purQuotationSelectionProductList) {
+                i ++ ;
+                entity.setCreateTime(DateUtils.getNextTime(i));
+                entity.setUpdateTime(null);
+                entity.setCreateBy(null);
+                entity.setUpdateBy(null);
 
                 BigDecimal taxAmount = entity.getTaxAmount() == null ? BigDecimal.ZERO:entity.getTaxAmount();
                 BigDecimal taxAmountUsd = entity.getTaxAmountUsd() == null ? BigDecimal.ZERO:entity.getTaxAmountUsd();
@@ -178,9 +185,15 @@ public class PurQuotationSelectionServiceImpl extends ServiceImpl<PurQuotationSe
         BigDecimal totalAmountUsd = BigDecimal.ZERO;
 
         if (purQuotationSelectionProductList != null && purQuotationSelectionProductList.size() > 0) {
-
+            int i = 0;
             for (PurQuotationSelectionProduct entity : purQuotationSelectionProductList) {
 
+                i ++ ;
+                entity.setCreateTime(DateUtils.getNextTime(i));
+                entity.setUpdateTime(entity.getCreateTime());
+                entity.setCreateBy(null);
+                entity.setUpdateBy(null);
+
                 BigDecimal taxAmount = entity.getTaxAmount() == null ? BigDecimal.ZERO:entity.getTaxAmount();
                 BigDecimal taxAmountUsd = entity.getTaxAmountUsd() == null ? BigDecimal.ZERO:entity.getTaxAmountUsd();
                 totalAmount = totalAmount.add(taxAmount);

+ 4 - 0
srm-module-code/src/main/java/org/jeecg/modules/purCode/vo/PurQuotationSelectionAlert.java

@@ -228,4 +228,8 @@ public class PurQuotationSelectionAlert implements Serializable {
 
     //质量等级
     private String qualityGradeHead;
+    //物料档案税类
+    private java.math.BigDecimal taxRate;
+    //物料档案毛利率
+    private java.math.BigDecimal grossMargin;
 }

+ 3 - 2
srm-module-code/src/main/java/org/jeecg/modules/saleCode/controller/SaleDeliveryController.java

@@ -4,6 +4,7 @@ import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
@@ -915,7 +916,7 @@ public class SaleDeliveryController {
                         }
                     }
                 }
-                deliverMoney = deliverMoney.setScale(2);
+                deliverMoney = deliverMoney.setScale(2, RoundingMode.HALF_UP);
                 saleDelivery.setDeliveryMoney(deliverMoney);
 
                 String shipname = "";
@@ -1073,7 +1074,7 @@ public class SaleDeliveryController {
                         }
                     }
                 }
-                deliverMoney = deliverMoney.setScale(2);
+                deliverMoney = deliverMoney.setScale(2, RoundingMode.HALF_UP);
                 saleDelivery.setDeliveryMoney(deliverMoney);
 
                 String shipname = "";

+ 67 - 0
srm-module-code/src/main/java/org/jeecg/modules/saleCode/controller/SaleInterfaceSyncController.java

@@ -5,6 +5,7 @@ import java.io.File;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.net.URLDecoder;
 import java.util.*;
 import java.util.List;
@@ -493,6 +494,72 @@ public class SaleInterfaceSyncController {
         return Result.OK("文件导入失败!");
     }
 
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @ApiOperation(value="导入产品", notes="导入产品")
+    @RequestMapping(value = "/importProduct", method = RequestMethod.POST)
+    public Result<?> importProduct(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            // 获取上传文件对象
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<SaleInterfaceItem> list = ExcelImportUtil.importExcel(file.getInputStream(), SaleInterfaceItem.class, params);
+                int num = 1;
+
+                for (SaleInterfaceItem page : list) {
+
+                    Integer number = page.getNumber();
+                    if(number == null){
+                        page.setNumber(num);
+                        num++;
+                    }
+                    String description = page.getDescription();
+                    String quantity = page.getQuantity();
+                    try {
+
+                        if(StringUtils.isNotBlank(quantity)){
+                            BigDecimal q =  new BigDecimal(quantity);
+                            page.setQuantity(q.toString());
+                        }
+
+                    }catch (Exception e){
+                        return Result.error("文件导入失败:quantity必须为数字" );
+                    }
+
+                    if(StringUtils.isBlank(description)){
+                        return Result.error("文件导入失败:description不能为空" );
+                    }
+
+                }
+
+                SaleInterfaceSync po = new SaleInterfaceSync();
+                saleInterfaceSyncService.saveMain(po, list);
+                return Result.OK("文件导入成功!数据行数:" + list.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.OK("文件导入失败!");
+    }
+
 	 /**
 	  * 导入
 	  */

+ 36 - 11
srm-module-code/src/main/java/org/jeecg/modules/saleCode/controller/SaleInvoiceController.java

@@ -200,10 +200,15 @@ public class SaleInvoiceController {
     }
 
     public static void main(String[] args) {
-        LocalDate startDate = LocalDate.of(2025, 1, 1);
-        LocalDate endDate = LocalDate.now();
-        long days = getDaysBetweenDates(startDate, endDate);
-        System.out.println("相差天数:" + days);
+        BigDecimal taxMoneyHead = new BigDecimal("-4");
+        System.out.println(taxMoneyHead.compareTo(BigDecimal.ZERO));
+        if(taxMoneyHead.compareTo(BigDecimal.ZERO) < 0){
+            System.out.println("相差天数:" );
+        }
+//        LocalDate startDate = LocalDate.of(2025, 1, 1);
+//        LocalDate endDate = LocalDate.now();
+//        long days = getDaysBetweenDates(startDate, endDate);
+//        System.out.println("相差天数:" + days);
     }
     /**
      * 添加
@@ -227,10 +232,24 @@ public class SaleInvoiceController {
             return Result.error("发票来源异常,请刷新后重试!");
         }
 
+
+        BigDecimal taxMoneyHead = BigDecimal.ZERO;
+        //计算表头金额合计
+        if(saleInvoicePage.getSaleInvoiceProductList()!=null && saleInvoicePage.getSaleInvoiceProductList().size()>0) {
+            for(SaleInvoiceProduct entity:saleInvoicePage.getSaleInvoiceProductList()) {
+                BigDecimal taxMoney = entity.getTaxMoney();
+                taxMoneyHead = taxMoneyHead.add(taxMoney);
+            }
+        }
+
         if (StringUtils.isNotBlank(code)) {
 
             QueryWrapper<SaleInvoice> queryWrapper = new QueryWrapper();
-            queryWrapper.eq("invoice_code", code);
+            if(taxMoneyHead.compareTo(BigDecimal.ZERO) < 0){
+                queryWrapper.eq("invoice_code1", code);
+            }else{
+                queryWrapper.eq("invoice_code", code);
+            }
             queryWrapper.eq("del_flag", "0");
 
             List<SaleInvoice> list = saleInvoiceService.list(queryWrapper);
@@ -238,12 +257,16 @@ public class SaleInvoiceController {
                 return Result.error("销售发票编码重复,请修改!");
             }
         } else {
-
-            Result<String> result = serialPatternService.getNextSerial("sale_invoice", "invoice_code");
+            String param = "invoice_code";
+            if(taxMoneyHead.compareTo(BigDecimal.ZERO) < 0){
+                param = "invoice_code1";
+            };
+            Result<String> result = serialPatternService.getNextSerial("sale_invoice", param);
             if (!result.isSuccess()) {
                 return result;
             }
             saleInvoice.setInvoiceCode(result.getMessage());
+            saleInvoice.setInvoiceCode1(result.getMessage());
         }
 
 
@@ -251,6 +274,8 @@ public class SaleInvoiceController {
         return Result.OK("添加成功!");
     }
 
+
+
     /**
      * 编辑
      *
@@ -1017,7 +1042,7 @@ public class SaleInvoiceController {
                             }
                         }
                     }
-                    saleInvoice.setInvoiceMoney(invoiceMoney.setScale(2));
+                    saleInvoice.setInvoiceMoney(invoiceMoney.setScale(2, RoundingMode.HALF_UP));
 
                     if (oConvertUtils.isNotEmpty(saleOrder.getDoubleDiscount())) {
                         saleInvoice.setDiscountText(saleOrder.getDoubleDiscount().doubleValue() + "%");
@@ -1064,7 +1089,7 @@ public class SaleInvoiceController {
                         BigDecimal amount = o.getTaxMoney() == null ? BigDecimal.ZERO : o.getTaxMoney();
                         orderMoney = orderMoney.add(amount);
                     }
-                    saleInvoice.setOrderMoney(orderMoney.setScale(2));
+                    saleInvoice.setOrderMoney(orderMoney.setScale(2, RoundingMode.HALF_UP));
                     saleInvoice.setAgreementTerms(saleOrder.getAgreementTerms());
                     // 制单人信息
 //                SysUser sysUser = sysUserService.getUserByName(saleInvoice.getCreateBy());
@@ -1266,7 +1291,7 @@ public class SaleInvoiceController {
                             }
                         }
                     }
-                    saleInvoice.setInvoiceMoney(invoiceMoney.setScale(2));
+                    saleInvoice.setInvoiceMoney(invoiceMoney.setScale(2, RoundingMode.HALF_UP));
 
 //                    if (oConvertUtils.isNotEmpty(saleOrder.getDoubleDiscount())) {
 //                        saleInvoice.setDiscountText(saleOrder.getDoubleDiscount().intValue() + "%");
@@ -1313,7 +1338,7 @@ public class SaleInvoiceController {
                         BigDecimal amount = o.getTaxMoney() == null ? BigDecimal.ZERO : o.getTaxMoney();
                         orderMoney = orderMoney.add(amount);
                     }
-                    saleInvoice.setOrderMoney(orderMoney.setScale(2));
+                    saleInvoice.setOrderMoney(orderMoney.setScale(2, RoundingMode.HALF_UP));
 //                    saleInvoice.setAgreementTerms(saleOrder.getAgreementTerms());
                     // 制单人信息
 //                SysUser sysUser = sysUserService.getUserByName(saleInvoice.getCreateBy());

+ 6 - 6
srm-module-code/src/main/java/org/jeecg/modules/saleCode/controller/SaleOrderController.java

@@ -1292,7 +1292,7 @@ public class SaleOrderController {
                     orderMoney = orderMoney.add(amount);
 
                 }
-                orderMoney = orderMoney.setScale(2);
+                orderMoney = orderMoney.setScale(2, RoundingMode.HALF_UP);
                 saleOrder.setOrderMoney(orderMoney);
 
                 List<String> getNotes = productList.stream()
@@ -1327,7 +1327,7 @@ public class SaleOrderController {
                 saleOrder.setBillDateText(DateUtils.date2Str(saleOrder.getBillDate(), DateUtils.date_sdf.get()));
                 if (oConvertUtils.isNotEmpty(saleOrder.getDoubleDiscount())) {
                     saleOrder.setDiscountText(saleOrder.getDoubleDiscount().doubleValue() + "%");
-                    saleOrder.setDiscountMoney(orderMoney.subtract(saleOrder.getConvertedAmount()).setScale(2));
+                    saleOrder.setDiscountMoney(orderMoney.subtract(saleOrder.getConvertedAmount()).setScale(2, RoundingMode.HALF_UP));
                 }
 
                 // 制单人信息
@@ -1448,7 +1448,7 @@ public class SaleOrderController {
                             String saleId = a.getId();
                             if (StringUtils.isNotBlank(o.getSourceId()) && o.getSourceId().equals(saleId)) {
                                 if (a.getDiscount() != null) {
-                                    o.setDiscountText(a.getDiscount().setScale(2).toString()+"%");
+                                    o.setDiscountText(a.getDiscount().setScale(2, RoundingMode.HALF_UP).toString()+"%");
                                 }
                                 if (a.getSalePrice() != null) {
 
@@ -1589,7 +1589,7 @@ public class SaleOrderController {
                             String saleId = a.getId();
                             if (StringUtils.isNotBlank(o.getSourceId()) && o.getSourceId().equals(saleId)) {
                                 if (a.getDiscount() != null) {
-                                    o.setDiscountText(a.getDiscount().setScale(2).toString()+"%");
+                                    o.setDiscountText(a.getDiscount().setScale(2, RoundingMode.HALF_UP).toString()+"%");
                                 }
                                 if (a.getSalePrice() != null) {
 
@@ -1614,7 +1614,7 @@ public class SaleOrderController {
                     }
 
                 }
-                orderMoney = orderMoney.setScale(2);
+                orderMoney = orderMoney.setScale(2, RoundingMode.HALF_UP);
                 saleOrder.setOrderMoney(orderMoney);
 
                 String shipname = "";
@@ -1651,7 +1651,7 @@ public class SaleOrderController {
                 saleOrder.setBillDateText(DateUtils.date2Str(saleOrder.getBillDate(), DateUtils.date_sdf.get()));
                 if (oConvertUtils.isNotEmpty(saleOrder.getDoubleDiscount())) {
                     saleOrder.setDiscountText(saleOrder.getDoubleDiscount().doubleValue() + "%");
-                    saleOrder.setDiscountMoney(orderMoney.subtract(saleOrder.getConvertedAmount()).setScale(2));
+                    saleOrder.setDiscountMoney(orderMoney.subtract(saleOrder.getConvertedAmount()).setScale(2, RoundingMode.HALF_UP));
                 }
 
                 // 制单人信息

+ 5 - 4
srm-module-code/src/main/java/org/jeecg/modules/saleCode/controller/SaleQuotationController.java

@@ -2,6 +2,7 @@ package org.jeecg.modules.saleCode.controller;
 
 import java.io.*;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
@@ -607,9 +608,9 @@ public class SaleQuotationController {
     @GetMapping(value = "/querySaleQuotationProductByMainId")
     public Result<List<SaleQuotationProduct>> querySaleQuotationProductListByMainId(@RequestParam(name = "id", required = true) String id) {
         List<SaleQuotationProduct> saleQuotationProductList = saleQuotationProductService.selectByMainId(id);
-        for(SaleQuotationProduct o:saleQuotationProductList){
-            o.setLastPrice(new BigDecimal("23"));
-        }
+//        for(SaleQuotationProduct o:saleQuotationProductList){
+//            o.setLastPrice(new BigDecimal("23"));
+//        }
         return Result.OK(saleQuotationProductList);
     }
 
@@ -755,7 +756,7 @@ public class SaleQuotationController {
                         o.setSalePrice(taxPriceOriginal);
                     }
                 }
-                saleQuotation.setOrderMoney(orderMoney.setScale(2));
+                saleQuotation.setOrderMoney(orderMoney.setScale(2, RoundingMode.HALF_UP));
 
                 String shipname = "";
                 String imo = "";

+ 2 - 0
srm-module-code/src/main/java/org/jeecg/modules/saleCode/entity/SaleInvoice.java

@@ -88,6 +88,8 @@ public class SaleInvoice implements Serializable {
 	@Excel(name = "单据编码", width = 15)
     @ApiModelProperty(value = "单据编码")
     private String invoiceCode;
+	//负数编码
+    private String invoiceCode1;
 	/**项目(project)*/
 	//@Excel(name = "项目(project)", width = 15)
     @ApiModelProperty(value = "项目(project)")

+ 2 - 2
srm-module-code/src/main/java/org/jeecg/modules/saleCode/mapper/xml/SaleDeliveryDetailsMapper.xml

@@ -53,7 +53,7 @@
                 and a.close = 0
                 and b.del_flag = 0
                 and d.status = 1
-                and IFNULL(c.virtual_product,0) = 0
+                and IFNULL(c.virtual_product,0) = 0 order by b.create_time asc
              ) a
             ${ew.customSqlSegment}
 
@@ -97,7 +97,7 @@
                 and a.close = 0
                 and b.del_flag = 0
                 and d.status = 1
-
+              order by b.create_time asc
              ) a
             ${ew.customSqlSegment}
 

+ 3 - 3
srm-module-code/src/main/java/org/jeecg/modules/saleCode/mapper/xml/SaleInquiryFormProductMapper.xml

@@ -11,7 +11,7 @@
             resultType="org.jeecg.modules.saleCode.entity.SaleInquiryFormProduct">
         SELECT *
         FROM sale_inquiry_form_product
-        WHERE head_id = #{mainId}    </select>
+        WHERE head_id = #{mainId}  order by create_time asc  </select>
 
     <select id="alertSaleInquiryList" resultType="org.jeecg.modules.saleCode.vo.SaleInquiryFormAlert">
         select *
@@ -47,8 +47,8 @@
                    and a.submit = 1
                    <!--and a.status = 0-->
                    and b.del_flag = 0
-                    and d.status = 1
-             ) a
+                    and d.status = 1 order by b.create_time asc
+        ) a
             ${ew.customSqlSegment}
     </select>
 </mapper>

+ 3 - 3
srm-module-code/src/main/java/org/jeecg/modules/saleCode/mapper/xml/SaleOrderProductMapper.xml

@@ -12,7 +12,7 @@
 		SELECT a.* , ROUND(a.tax_price / ((100 - IFNULL(a.discount, 0)) / 100), 2) as pre_discount_price
 		FROM  sale_order_product a
 		WHERE
-			a.head_id = #{mainId} 	</select>
+			a.head_id = #{mainId} order by a.create_time asc </select>
 
 
 	<select id="selectSaleOrderDetailAlert" parameterType="java.lang.String" resultType="org.jeecg.modules.saleCode.vo.SaleOrderAlert">
@@ -63,7 +63,7 @@
 				  and a.submit = 1
 				  and b.del_flag = 0
 				  and d.status = 1
-		order by a.create_time
+		order by b.create_time
 
 			 ) a
 			${ew.customSqlSegment}
@@ -119,7 +119,7 @@
 				  and b.del_flag = 0
 				  and d.status = 1
 					and c.del_flag = 0 and c.deal_result='索赔' and c.deal='处理中'
-		order by a.create_time
+					order by b.create_time
 
 			 ) a
 			${ew.customSqlSegment}

+ 2 - 2
srm-module-code/src/main/java/org/jeecg/modules/saleCode/mapper/xml/SaleQuotationProductMapper.xml

@@ -12,7 +12,7 @@
 		SELECT a.*, ROUND(a.sale_price/((100 - IFNULL(a.discount,0))/100),2) as pre_discount_price
 		FROM  sale_quotation_product a
 		WHERE
-			a.head_id = #{mainId} 	</select>
+			a.head_id = #{mainId} order by a.create_time asc 	</select>
 
 
 	<select id="selectHisByInfo" parameterType="java.lang.String" resultType="org.jeecg.modules.saleCode.entity.SaleQuotation">
@@ -77,7 +77,7 @@
 				   and a.status = 1
 				   and b.del_flag = 0
 				   and e.status = 1
-
+				 order by b.create_time asc
 			 ) a
 			${ew.customSqlSegment}
 	</select>

+ 16 - 0
srm-module-code/src/main/java/org/jeecg/modules/saleCode/service/impl/SaleInquiryFormServiceImpl.java

@@ -3,6 +3,7 @@ package org.jeecg.modules.saleCode.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.baseCode.entity.BaseShipArchive;
 import org.jeecg.modules.baseCode.mapper.BaseShipArchiveMapper;
 import org.jeecg.modules.saleCode.entity.SaleInquiryForm;
@@ -78,8 +79,16 @@ public class SaleInquiryFormServiceImpl extends ServiceImpl<SaleInquiryFormMappe
 			}
 		}
 		if(saleInquiryFormProductList!=null && saleInquiryFormProductList.size()>0) {
+			int i = 0;
 			for(SaleInquiryFormProduct entity:saleInquiryFormProductList) {
+				i ++ ;
 				entity.setId(null);
+
+				entity.setCreateTime(DateUtils.getNextTime(i));
+				entity.setUpdateTime(null);
+				entity.setCreateBy(null);
+				entity.setUpdateBy(null);
+
 				//外键设置
 				entity.setHeadId(saleInquiryForm.getId());
 				saleInquiryFormProductMapper.insert(entity);
@@ -123,7 +132,14 @@ public class SaleInquiryFormServiceImpl extends ServiceImpl<SaleInquiryFormMappe
 			}
 		}
 		if(saleInquiryFormProductList!=null && saleInquiryFormProductList.size()>0) {
+			int i = 0;
 			for(SaleInquiryFormProduct entity:saleInquiryFormProductList) {
+				i ++ ;
+				entity.setCreateTime(DateUtils.getNextTime(i));
+				entity.setUpdateTime(entity.getCreateTime());
+				entity.setCreateBy(null);
+				entity.setUpdateBy(null);
+
 				entity.setId(null);
 				//外键设置
 				entity.setHeadId(saleInquiryForm.getId());

+ 72 - 18
srm-module-code/src/main/java/org/jeecg/modules/saleCode/service/impl/SaleInvoiceServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.commons.lang.StringUtils;
+import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.platCode.entity.PlatCommissionOrder;
@@ -66,6 +67,22 @@ public class SaleInvoiceServiceImpl extends ServiceImpl<SaleInvoiceMapper, SaleI
 	@Transactional(rollbackFor = Exception.class)
 	public void saveMain(SaleInvoice saleInvoice, List<SaleInvoiceShip> saleInvoiceShipList,List<SaleInvoiceProduct> saleInvoiceProductList) {
 
+		String invoiceCode = saleInvoice.getInvoiceCode();//发票号
+		String invoiceCode1 = saleInvoice.getInvoiceCode1();//负数发票号
+		QueryWrapper<SaleInvoice> queryWrapper = new QueryWrapper();
+
+		if(StringUtils.isNotBlank(invoiceCode1)){
+			queryWrapper.eq("invoice_code1", invoiceCode1);
+		}else{
+			queryWrapper.eq("invoice_code", invoiceCode);
+		}
+		queryWrapper.eq("del_flag", "0");
+
+		List<SaleInvoice> list = this.list(queryWrapper);
+		if (list.size() != 0) {
+			return;
+		}
+
 		String sourceCode = saleInvoice.getSourceCode();//发货单来源
 		String sourceCode2 = saleInvoice.getSourceCode2();//佣金订单来源
 //
@@ -268,20 +285,39 @@ public class SaleInvoiceServiceImpl extends ServiceImpl<SaleInvoiceMapper, SaleI
 //
 		if(StringUtils.isNotBlank(sourceCode)){
 
-			UpdateWrapper<SaleDelivery> updateWrapper = new UpdateWrapper<>();
-			updateWrapper.eq("bill_code", sourceCode); 	// 设置主键
-			updateWrapper.set("invoice_code", null);  			// 设置 invoice_code 为 null
-			saleDeliveryMapper.update(new SaleDelivery(), updateWrapper); 		// 调用更新
+
+			QueryWrapper<SaleInvoice> queryWrapper = new QueryWrapper<>();
+			queryWrapper.in("source_code",sourceCode);
+			queryWrapper.eq("close","0");
+			queryWrapper.eq("del_flag","0");
+			queryWrapper.notIn("id",id);
+			List<SaleInvoice> list = this.list(queryWrapper);
+			if(list.size() == 0){
+
+				UpdateWrapper<SaleDelivery> updateWrapper = new UpdateWrapper<>();
+				updateWrapper.eq("bill_code", sourceCode); 	// 设置主键
+				updateWrapper.set("invoice_code", null);  			// 设置 invoice_code 为 null
+				saleDeliveryMapper.update(new SaleDelivery(), updateWrapper); 		// 调用更新
+			}
 
 		}
 		if(StringUtils.isNotBlank(sourceCode2)){
 
-			String[] code = sourceCode2.split(",");
-			UpdateWrapper<PlatCommissionOrder> updateWrapper = new UpdateWrapper<>();
-			updateWrapper.in("bill_code", code); 	// 设置主键
-			updateWrapper.set("invoice_code", null);  			// 设置 invoice_code 为 null
-			platCommissionOrderMapper.update(new PlatCommissionOrder(), updateWrapper); 		// 调用更新
+			QueryWrapper<SaleInvoice> queryWrapper = new QueryWrapper<>();
+			queryWrapper.in("source_code2",sourceCode);
+			queryWrapper.eq("close","0");
+			queryWrapper.eq("del_flag","0");
+			queryWrapper.notIn("id",id);
+			List<SaleInvoice> list = this.list(queryWrapper);
+			if(list.size() == 0){
+
+				String[] code = sourceCode2.split(",");
+				UpdateWrapper<PlatCommissionOrder> updateWrapper = new UpdateWrapper<>();
+				updateWrapper.in("bill_code", code); 	// 设置主键
+				updateWrapper.set("invoice_code", null);  			// 设置 invoice_code 为 null
+				platCommissionOrderMapper.update(new PlatCommissionOrder(), updateWrapper); 		// 调用更新
 
+			}
 		}
 
 		saleInvoiceShipMapper.deleteByMainId(id);
@@ -301,20 +337,38 @@ public class SaleInvoiceServiceImpl extends ServiceImpl<SaleInvoiceMapper, SaleI
 //
 			if(StringUtils.isNotBlank(sourceCode)){
 
-				UpdateWrapper<SaleDelivery> updateWrapper = new UpdateWrapper<>();
-				updateWrapper.eq("bill_code", sourceCode); 	// 设置主键
-				updateWrapper.set("invoice_code", null);  			// 设置 invoice_code 为 null
-				saleDeliveryMapper.update(new SaleDelivery(), updateWrapper); 		// 调用更新
+				QueryWrapper<SaleInvoice> queryWrapper = new QueryWrapper<>();
+				queryWrapper.in("source_code",sourceCode);
+				queryWrapper.eq("close","0");
+				queryWrapper.eq("del_flag","0");
+				queryWrapper.notIn("id",id);
+				List<SaleInvoice> list = this.list(queryWrapper);
+				if(list.size() == 0){
+
+					UpdateWrapper<SaleDelivery> updateWrapper = new UpdateWrapper<>();
+					updateWrapper.eq("bill_code", sourceCode); 	// 设置主键
+					updateWrapper.set("invoice_code", null);  			// 设置 invoice_code 为 null
+					saleDeliveryMapper.update(new SaleDelivery(), updateWrapper); 		// 调用更新
+				}
 
 			}
 			if(StringUtils.isNotBlank(sourceCode2)){
 
-				String[] code = sourceCode2.split(",");
-				UpdateWrapper<PlatCommissionOrder> updateWrapper = new UpdateWrapper<>();
-				updateWrapper.in("bill_code", code); 	// 设置主键
-				updateWrapper.set("invoice_code", null);  			// 设置 invoice_code 为 null
-				platCommissionOrderMapper.update(new PlatCommissionOrder(), updateWrapper); 		// 调用更新
+				QueryWrapper<SaleInvoice> queryWrapper = new QueryWrapper<>();
+				queryWrapper.in("source_code2",sourceCode);
+				queryWrapper.eq("close","0");
+				queryWrapper.eq("del_flag","0");
+				queryWrapper.notIn("id",id);
+				List<SaleInvoice> list = this.list(queryWrapper);
+				if(list.size() == 0){
 
+					String[] code = sourceCode2.split(",");
+					UpdateWrapper<PlatCommissionOrder> updateWrapper = new UpdateWrapper<>();
+					updateWrapper.in("bill_code", code); 	// 设置主键
+					updateWrapper.set("invoice_code", null);  			// 设置 invoice_code 为 null
+					platCommissionOrderMapper.update(new PlatCommissionOrder(), updateWrapper); 		// 调用更新
+
+				}
 			}
 
 			saleInvoiceShipMapper.deleteByMainId(id.toString());

+ 15 - 0
srm-module-code/src/main/java/org/jeecg/modules/saleCode/service/impl/SaleQuotationServiceImpl.java

@@ -1,6 +1,7 @@
 package org.jeecg.modules.saleCode.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.baseCode.entity.BaseShipArchive;
 import org.jeecg.modules.baseCode.mapper.BaseShipArchiveMapper;
 import org.jeecg.modules.saleCode.entity.SaleOrderShip;
@@ -88,9 +89,16 @@ public class SaleQuotationServiceImpl extends ServiceImpl<SaleQuotationMapper, S
 			}
 		}
 		if(saleQuotationProductList!=null && saleQuotationProductList.size()>0) {
+			int i = 0;
 			for(SaleQuotationProduct entity:saleQuotationProductList) {
+				i ++ ;
 				//外键设置
 				entity.setId(null);
+				entity.setCreateTime(DateUtils.getNextTime(i));
+				entity.setUpdateTime(null);
+				entity.setCreateBy(null);
+				entity.setUpdateBy(null);
+
 				entity.setHeadId(saleQuotation.getId());
 				saleQuotationProductMapper.insert(entity);
 			}
@@ -149,9 +157,16 @@ public class SaleQuotationServiceImpl extends ServiceImpl<SaleQuotationMapper, S
 			}
 		}
 		if(saleQuotationProductList!=null && saleQuotationProductList.size()>0) {
+			int i = 0;
 			for(SaleQuotationProduct entity:saleQuotationProductList) {
+				//外键设置
+				i ++ ;
 				//外键设置
 				entity.setId(null);
+				entity.setCreateTime(DateUtils.getNextTime(i));
+				entity.setUpdateTime(entity.getCreateTime());
+				entity.setCreateBy(null);
+				entity.setUpdateBy(null);
 				entity.setHeadId(saleQuotation.getId());
 				saleQuotationProductMapper.insert(entity);
 			}