Commit 8015840e511c497d3b529b84a6f86193712ed728

Authored by chenhang4442024
1 parent 56ba16e6

feat : 1.增加生成对账单的Excel功能(AccountStatement)

2.对于invoice和check的状态增加 两个状态,提供两个状态的手动设置接口
       3.添加扣款单审核功能(需要手动审核)
fix  : 1.以前数据库中存储文件oss的永久链接访问,现在只存储文件oss的前缀域名和文件名,后续获取文件都是采用拼接accesskey实时链接获取
        2.对于订单状态重新设置
Showing 41 changed files with 1919 additions and 210 deletions
src/main/java/com/order/erp/common/constant/Constant.java
... ... @@ -162,7 +162,7 @@ public class Constant {
162 162 public static final int SEVEN = 7;
163 163 public static final int FOURTEEN= 14;
164 164 public static final int THIRTY = 30;
165   -
  165 + public static final int SIXTY = 60;
166 166 public static final int TWENTY_FIRST = 21;
167 167  
168 168  
... ... @@ -337,7 +337,7 @@ public class Constant {
337 337 * redis过期时间。
338 338 */
339 339 public static final long REDIS_EMAIL_TIME = 90;
340   -
  340 + public static final long ONEPOINTNINE_HOURS = 6840; //1.9个小时 114分钟。
341 341 public static final String FINANCE_EVENT_TIME = "请自行去系统中查询!";
342 342  
343 343 public static final String FINANCE_EVENT_TITLE_INNERNO = " , 对应内部编号为 : ";
... ... @@ -345,4 +345,13 @@ public class Constant {
345 345 public static final String FINANCE_EVENT_TITLE_PROJECTNO = " , 对应项目号为 : ";
346 346 public static final String ORDERBASEINFO_PRODUCTIONCOMMENT = " , 更新信息为 : ";
347 347  
  348 + /**
  349 + * 文件oss。
  350 + */
  351 + public static final String OSS_PIC_URL="oss_pic_url"; //图片资源
  352 + public static final String OSS_SMALL_PIC_URL="oss_small_pic_url"; //缩略图资源
  353 + public static final String OSS_INVOICE_DEDUCT_URL="oss_invoice_deduct_url"; //invoice扣款单
  354 + public static final String OSS_CHECK_DEDUCT_URL="oss_check_deduct_url"; //check扣款单
  355 + public static final String OSS_BG_URL="oss_bg_url"; //报关单
  356 + public static final String OSS_INVOICE_URL="oss_invoice_url"; //发票
348 357 }
... ...
src/main/java/com/order/erp/common/utils/AccountStatementExcel.java 0 → 100644
  1 +package com.order.erp.common.utils;
  2 +
  3 +import com.order.erp.common.constant.Constant;
  4 +import com.order.erp.domain.excel.AccountStatementExcelVO;
  5 +import lombok.extern.slf4j.Slf4j;
  6 +import org.apache.poi.ss.usermodel.*;
  7 +import org.apache.poi.ss.util.CellRangeAddress;
  8 +import org.apache.poi.util.IOUtils;
  9 +import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  10 +import org.joda.time.DateTime;
  11 +import org.springframework.stereotype.Service;
  12 +
  13 +import javax.servlet.http.HttpServletResponse;
  14 +import java.io.IOException;
  15 +import java.io.InputStream;
  16 +import java.net.URL;
  17 +import java.util.HashMap;
  18 +import java.util.List;
  19 +@Service
  20 +@Slf4j
  21 +public class AccountStatementExcel {
  22 + public void AccountStatementExcel(HttpServletResponse response, List<AccountStatementExcelVO> accountStatementExcelVOList) throws IOException {
  23 + Workbook workbook = new XSSFWorkbook();
  24 + Sheet sheet = workbook.createSheet("对账单");
  25 + Font font = workbook.createFont();
  26 + font.setFontHeightInPoints((short) 14);
  27 +
  28 + CellStyle borderStyle = workbook.createCellStyle();
  29 + borderStyle.setFont(font);
  30 + borderStyle.setBorderTop(BorderStyle.THIN);
  31 + borderStyle.setBorderBottom(BorderStyle.THIN);
  32 + borderStyle.setBorderLeft(BorderStyle.THIN);
  33 + borderStyle.setBorderRight(BorderStyle.THIN);
  34 +
  35 + Row titleRow = sheet.createRow(0); // 第一行
  36 + Cell titleheaderCell = titleRow.createCell(0);
  37 + titleheaderCell.setCellValue(accountStatementExcelVOList.get(0).getTitleCompany()); // 设置你想要的标题内容
  38 + titleheaderCell.setCellStyle(borderStyle); // 设置样式
  39 +
  40 + CellStyle titleStyle = workbook.createCellStyle();
  41 + Font titleFont = workbook.createFont();
  42 + titleFont.setFontHeightInPoints((short) 20);
  43 + titleStyle.setFont(titleFont);
  44 + titleStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中
  45 + titleStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
  46 + titleheaderCell.setCellStyle(titleStyle); // 将样式应用到单元格
  47 +
  48 +// 合并单元格(例如合并 A1 到 L1)
  49 + sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 11));
  50 +
  51 +// 设置标题栏的列宽
  52 + for (int i = 0; i < 12; i++) {
  53 + sheet.setColumnWidth(i, 5000); // 根据需求调整宽度
  54 + }
  55 + titleRow.setHeightInPoints(30);
  56 +// 设置每页的顶部重复显示标题栏
  57 + sheet.setRepeatingRows(new CellRangeAddress(0,1,-1,-1)); // 从第1行到第2行(即标题行和生产科,内部编号等等那一行)在每一页重复显示
  58 +
  59 + Row headerRow = sheet.createRow(1);
  60 + String[] headers = {"生产科", "内部编号", "Client PC", "STYLE", "REFERENCE", "颜色中文", "PIC 图片", "数量", "拖货时间", "包装类型", "生产科单价", "生产科总价"};
  61 + for (int i = 0; i < headers.length; i++) {
  62 + Cell cell = headerRow.createCell(i);
  63 + cell.setCellValue(headers[i]);
  64 + cell.setCellStyle(borderStyle);
  65 + }
  66 +
  67 + long totalQuantity = 0;
  68 + double totalPrice = 0;
  69 +
  70 + for (int i = 0; i < accountStatementExcelVOList.size(); i++) {
  71 + AccountStatementExcelVO item = accountStatementExcelVOList.get(i);
  72 +
  73 + URL imageURL = new URL( AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(item.getSmallPicUrl()),SplitUrlGetBucketName.getFileName(item.getSmallPicUrl()),new DateTime().plusYears(Constant.ENABLE_TEN).toDate()));
  74 + InputStream inputStream = imageURL.openStream();
  75 + byte[] imageBytes = IOUtils.toByteArray(inputStream);
  76 + int pictureIndex = workbook.addPicture(imageBytes, Workbook.PICTURE_TYPE_PNG);
  77 + inputStream.close();
  78 +
  79 + CreationHelper helper = workbook.getCreationHelper();
  80 + Drawing<?> drawing = sheet.createDrawingPatriarch();
  81 + ClientAnchor anchor = helper.createClientAnchor();
  82 + anchor.setCol1(6);
  83 + anchor.setRow1(i + 2);
  84 + anchor.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE);
  85 +
  86 + Picture picture = drawing.createPicture(anchor, pictureIndex);
  87 + picture.resize(1.0);
  88 +
  89 + Row row = sheet.createRow(i + 2);
  90 + String[] rowData = {
  91 + item.getProductionDepartment(), item.getInnerNo(), item.getCustomerPo(),
  92 + item.getCustomerStyle(), item.getModeleLo(), item.getCnColor(),
  93 + item.getSmallPicUrl(), String.valueOf(item.getOrderCount()),
  94 + item.getProductionDepartmentConsignTime().split(" ")[0], item.getPacketType(),
  95 + "¥" + String.format("%.2f", item.getProductionDepartmentPrice()),
  96 + "¥" + String.format("%.2f", item.getProductionDepartmentTotalPrice())
  97 + };
  98 +
  99 + for (int j = 0; j < rowData.length; j++) {
  100 + Cell cell = row.createCell(j);
  101 + cell.setCellValue(rowData[j]);
  102 + cell.setCellStyle(borderStyle);
  103 + }
  104 +
  105 + totalQuantity += item.getOrderCount();
  106 + totalPrice += item.getProductionDepartmentTotalPrice();
  107 + row.setHeightInPoints(90);
  108 + }
  109 +
  110 + int lastRowNum = accountStatementExcelVOList.size() + 2;
  111 + Row totalRow = sheet.createRow(lastRowNum);
  112 + for (int j = 0; j < 12; j++) {
  113 + totalRow.createCell(j);
  114 + }
  115 +
  116 + totalRow.getCell(0).setCellValue("合计");
  117 + totalRow.getCell(7).setCellValue(totalQuantity );
  118 + totalRow.getCell(11).setCellValue(totalPrice > 0 ? "¥" + String.format("%.2f", totalPrice) : "无数据");
  119 +
  120 +
  121 +
  122 + for (int j = 0; j < 12; j++) {
  123 + totalRow.getCell(j).setCellStyle(borderStyle);
  124 + }
  125 + totalRow.setHeightInPoints(50);
  126 +
  127 + int[] columnWidths = {3000, 4000, 7000, 6000, 6000, 4000, 4400, 2500, 4000, 3000, 3100, 4000};
  128 + for (int i = 0; i < columnWidths.length; i++) {
  129 + sheet.setColumnWidth(i, columnWidths[i]);
  130 + }
  131 +
  132 + //两个小的表格
  133 + Font smallFont = workbook.createFont();
  134 + smallFont.setFontHeightInPoints((short) 14);
  135 + // 记录开始行
  136 + int smallTableStartRow = lastRowNum + 2;
  137 +
  138 + List<HashMap<String, Double>> disbursement = accountStatementExcelVOList.get(0).getDisbursement();
  139 + List<HashMap<String, Double>> deduction = accountStatementExcelVOList.get(0).getDeduction();
  140 +
  141 +// 小表格边框样式
  142 + CellStyle smallTableStyle = workbook.createCellStyle();
  143 + smallTableStyle.setFont(smallFont);
  144 + smallTableStyle.setBorderTop(BorderStyle.THIN);
  145 + smallTableStyle.setBorderBottom(BorderStyle.THIN);
  146 + smallTableStyle.setBorderLeft(BorderStyle.THIN);
  147 + smallTableStyle.setBorderRight(BorderStyle.THIN);
  148 + smallTableStyle.setAlignment(HorizontalAlignment.CENTER);
  149 +
  150 +// **加粗标题样式**
  151 + CellStyle boldTitleStyle = workbook.createCellStyle();
  152 + Font boldFont = workbook.createFont();
  153 + boldFont.setBold(true);
  154 + boldFont.setFontHeightInPoints((short) 14);
  155 + boldTitleStyle.setFont(boldFont);
  156 + boldTitleStyle.setAlignment(HorizontalAlignment.CENTER);
  157 +
  158 +// 创建黄色背景的单元格样式
  159 + CellStyle yellowBackgroundStyle = workbook.createCellStyle();
  160 + yellowBackgroundStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
  161 + yellowBackgroundStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 设置为实心背景
  162 +
  163 +// **左侧小表格(扣费费用)**
  164 + Row leftTitleRow = sheet.getRow(smallTableStartRow);
  165 + if (leftTitleRow == null) {
  166 + leftTitleRow = sheet.createRow(smallTableStartRow);
  167 + }
  168 + Cell titleCell = leftTitleRow.createCell(2);
  169 + titleCell.setCellValue("扣费项目");
  170 + titleCell.setCellStyle(boldTitleStyle);
  171 + titleCell.setCellStyle(yellowBackgroundStyle);
  172 +
  173 + Row leftHeaderRow = sheet.createRow(smallTableStartRow + 1);
  174 + Cell nameHeaderCell = leftHeaderRow.createCell(2);
  175 + Cell amountHeaderCell = leftHeaderRow.createCell(3);
  176 + nameHeaderCell.setCellValue("名称");
  177 + amountHeaderCell.setCellValue("金额");
  178 + nameHeaderCell.setCellStyle(boldTitleStyle);
  179 + amountHeaderCell.setCellStyle(boldTitleStyle);
  180 +
  181 + int rowIndex = smallTableStartRow + 2;
  182 + double totalDisbursement = 0.0;
  183 +
  184 +
  185 + for (HashMap<String, Double> map : disbursement) {
  186 + for (String key : map.keySet()) {
  187 + Row row = sheet.getRow(rowIndex);
  188 + if (row == null) {
  189 + row = sheet.createRow(rowIndex);
  190 + }
  191 +
  192 + Cell nameCell = row.createCell(2);
  193 + Cell amountCell = row.createCell(3);
  194 +
  195 +
  196 +
  197 + nameCell.setCellValue(key);
  198 + amountCell.setCellValue("¥"+String.format("%.2f",map.get(key)));
  199 +
  200 + nameCell.setCellStyle(smallTableStyle);
  201 + amountCell.setCellStyle(smallTableStyle);
  202 +
  203 + row.setHeightInPoints(30);
  204 + rowIndex++;
  205 +
  206 + totalDisbursement += map.get(key);
  207 +
  208 + }
  209 + }
  210 +
  211 +// **左侧合计行**
  212 +// **创建合并样式**
  213 + CellStyle boldBorderStyle = workbook.createCellStyle();
  214 + boldBorderStyle.cloneStyleFrom(smallTableStyle); // 继承边框样式
  215 + boldBorderStyle.setFont(boldFont); // 加粗
  216 +
  217 +// **左侧合计行**
  218 + Row leftTotalRow = sheet.createRow(rowIndex);
  219 + Cell totalTitleCell = leftTotalRow.createCell(2);
  220 + Cell totalValueCell = leftTotalRow.createCell(3);
  221 +
  222 + totalTitleCell.setCellValue("合计");
  223 + totalValueCell.setCellValue("¥"+String.format("%.2f",totalDisbursement));
  224 +
  225 + totalTitleCell.setCellStyle(boldBorderStyle);
  226 + totalValueCell.setCellStyle(boldBorderStyle);
  227 +
  228 + rowIndex=rowIndex+1;
  229 +// **右侧小表格(垫带费用)**
  230 +// 增加一个空白行以增加间距
  231 + int totalAmountRowStart= rowIndex++; // 在创建“代垫费用”标题之前增加一个空白行
  232 +
  233 + Row rightTitleRow = sheet.createRow(rowIndex); // 创建代垫费用标题
  234 + rightTitleRow.createCell(2).setCellValue("代垫费用");
  235 + rightTitleRow.getCell(2).setCellStyle(boldTitleStyle);
  236 +
  237 +// **设置黄色背景**
  238 + rightTitleRow.getCell(2).setCellStyle(yellowBackgroundStyle);
  239 +
  240 + rowIndex++; // 下一行开始填充数据
  241 + Row rightHeaderRow = sheet.createRow(rowIndex); // 创建表头
  242 + rightHeaderRow.createCell(2).setCellValue("名称");
  243 + rightHeaderRow.createCell(3).setCellValue("金额");
  244 +
  245 +// **为表头添加黄色背景**
  246 + rightHeaderRow.getCell(2).setCellStyle(yellowBackgroundStyle);
  247 + rightHeaderRow.getCell(3).setCellStyle(yellowBackgroundStyle);
  248 +
  249 + rightHeaderRow.getCell(2).setCellStyle(boldTitleStyle);
  250 + rightHeaderRow.getCell(3).setCellStyle(boldTitleStyle);
  251 +
  252 + rowIndex++; // 继续到下一行
  253 + double totalDeduction = 0.0;
  254 +
  255 + for (HashMap<String, Double> map : deduction) {
  256 + for (String key : map.keySet()) {
  257 + Row row = sheet.getRow(rowIndex);
  258 + if (row == null) {
  259 + row = sheet.createRow(rowIndex);
  260 + }
  261 + row.createCell(2).setCellValue(key);
  262 + row.createCell(3).setCellValue("¥"+String.format("%.2f",map.get(key)));
  263 +
  264 + row.getCell(2).setCellStyle(smallTableStyle);
  265 + row.getCell(3).setCellStyle(smallTableStyle);
  266 + row.setHeightInPoints(30);
  267 + rowIndex++;
  268 +
  269 + totalDeduction += map.get(key); // 计算合计
  270 + }
  271 + }
  272 +
  273 +// **右侧合计行**
  274 + Row rightTotalRow = sheet.createRow(rowIndex);
  275 + rightTotalRow.createCell(2).setCellValue("合计");
  276 + rightTotalRow.createCell(3).setCellValue("¥"+String.format("%.2f",totalDeduction));
  277 +
  278 +// **添加边框样式到合计行**
  279 + CellStyle totalCellStyle = workbook.createCellStyle();
  280 + totalCellStyle.cloneStyleFrom(boldBorderStyle);
  281 + totalCellStyle.setBorderBottom(BorderStyle.THIN);
  282 + totalCellStyle.setBorderTop(BorderStyle.THIN);
  283 + totalCellStyle.setBorderLeft(BorderStyle.THIN);
  284 + totalCellStyle.setBorderRight(BorderStyle.THIN);
  285 +
  286 + rightTotalRow.getCell(2).setCellStyle(totalCellStyle);
  287 + rightTotalRow.getCell(3).setCellStyle(totalCellStyle);
  288 +
  289 +
  290 +// 调整小表格列宽
  291 + sheet.setColumnWidth(2, 7000);
  292 + sheet.setColumnWidth(3, 6000);
  293 +
  294 + // 计算总金额: 大表合计 - 小表格合计
  295 + double totalAmount = totalPrice - totalDisbursement - totalDeduction;
  296 +
  297 +// 在两个小表格的右方展示总金额
  298 + Row totalAmountRow = sheet.createRow(totalAmountRowStart); // 新建行
  299 + totalAmountRow.createCell(10).setCellValue("总金额");
  300 + totalAmountRow.createCell(11).setCellValue("¥"+String.format("%.2f", totalAmount));
  301 +
  302 +// 添加样式
  303 + CellStyle totalAmountStyle = workbook.createCellStyle();
  304 + totalAmountStyle.cloneStyleFrom(boldBorderStyle); // 继承合计行样式
  305 + totalAmountRow.getCell(10).setCellStyle(totalAmountStyle);
  306 + totalAmountRow.getCell(11).setCellStyle(totalAmountStyle);
  307 +
  308 +
  309 +
  310 +
  311 + PrintSetup printSetup = sheet.getPrintSetup();
  312 + printSetup.setPaperSize(PrintSetup.A4_PAPERSIZE);
  313 + sheet.setFitToPage(true);
  314 + sheet.getPrintSetup().setFitWidth((short) 1);
  315 + sheet.getPrintSetup().setFitHeight((short) 0);
  316 + sheet.getPrintSetup().setHeaderMargin(0.5);
  317 + sheet.getPrintSetup().setFooterMargin(0.5);
  318 + sheet.setMargin(Sheet.TopMargin, 1.0);
  319 + sheet.setMargin(Sheet.BottomMargin, 0.5);
  320 + sheet.setMargin(Sheet.LeftMargin, 0.5);
  321 + sheet.setMargin(Sheet.RightMargin, 0.5);
  322 +
  323 + Footer footer = sheet.getFooter();
  324 + footer.setCenter("第 &P 页,共 &N 页");
  325 +// response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=UTF-8");
  326 + response.setHeader("Content-Disposition", "attachment; filename=\"-.xlsx\"");
  327 + workbook.write(response.getOutputStream());
  328 + workbook.close();
  329 + }
  330 +
  331 +}
... ...
src/main/java/com/order/erp/common/utils/EasyPdfUtils.java
... ... @@ -13,6 +13,7 @@ import com.order.erp.service.LocalStorageService;
13 13 import com.order.erp.service.order.OrderBaseInfoService;
14 14 import com.order.erp.service.order.OrderProfitAnalysisService;
15 15 import lombok.extern.slf4j.Slf4j;
  16 +import org.joda.time.DateTime;
16 17 import org.springframework.beans.BeanUtils;
17 18 import org.springframework.beans.factory.annotation.Value;
18 19 import org.springframework.stereotype.Service;
... ... @@ -402,7 +403,8 @@ public class EasyPdfUtils {
402 403 }
403 404 dataCellList.add(createCell(StringUtils.isNotEmpty(producePdfVO.getCnColor()) ? producePdfVO.getCnColor() : "", 100F));
404 405 if (StringUtils.isNotBlank(producePdfVO.getPicUrl())) {
405   - URL url = new URL(producePdfVO.getPicUrl());
  406 + String onlineUrl = AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(producePdfVO.getPicUrl()), SplitUrlGetBucketName.getFileName(producePdfVO.getPicUrl()), new DateTime().plusMinutes(Constant.ENABLE_TEN).toDate());
  407 + URL url = new URL(onlineUrl);
406 408 InputStream inputStream = url.openStream();
407 409 File imageFile = FileUtil.inputStreamToFile(inputStream, "order" + System.currentTimeMillis() + ".png");
408 410  
... ...
src/main/java/com/order/erp/common/utils/SplitUrlGetBucketName.java 0 → 100644
  1 +package com.order.erp.common.utils;
  2 +
  3 +import lombok.extern.slf4j.Slf4j;
  4 +
  5 +import java.io.UnsupportedEncodingException;
  6 +import java.net.URLDecoder;
  7 +import java.nio.charset.StandardCharsets;
  8 +import java.util.regex.Matcher;
  9 +import java.util.regex.Pattern;
  10 +
  11 +@Slf4j
  12 +public class SplitUrlGetBucketName {
  13 + //获取文件名称以及域名。
  14 + /**
  15 + 例如: https://alterego.oss-cn-qingdao.aliyuncs.com/Thumbnails-1731807674577-943%E5%9B%BE%E7%89%871.png?accesskey=....
  16 + ==>
  17 + https://alterego.oss-cn-qingdao.aliyuncs.com/Thumbnails-1731807674577-943%E5%9B%BE%E7%89%871.png
  18 + */
  19 + public static String getUrlFileName(String url){
  20 + if(StringUtils.isNotEmpty(url)){
  21 + return url.split("\\?")[0];
  22 + }
  23 + return null;
  24 + }
  25 +
  26 + //获取bucket名称。
  27 + /**
  28 + * 例如: https://alterego.oss-cn-qingdao.aliyuncs.com/Thumbnails-1731807674577-943%E5%9B%BE%E7%89%871.png
  29 + * ==>
  30 + * alterego
  31 + * */
  32 + public static String getBucket(String url){
  33 + if(StringUtils.isNotEmpty(url)){
  34 + String domain = url.replaceFirst("^https?://", "").split("/")[0];
  35 + return domain.split("\\.")[0];
  36 + }
  37 + return null;
  38 +
  39 + }
  40 + //获取文件名称。
  41 + /**
  42 + * 例如:Thumbnails-1731807674577-943%E5%9B%BE%E7%89%871.png,如果原始文件中有中文,就返回中文,因为后续还会编码变成乱码,要是这里不返回中文,后面再次编码就相当于中文编码再编码了。
  43 + * 如果不为中文,则返回文件名。因为不包含中文名的文件名不会编译成乱码。为原始文件名。
  44 + */
  45 + public static String getFileName(String url){
  46 + if(StringUtils.isNotEmpty(url)){
  47 + //在上传pdf文件时,有时候存到数据库中,会在文件名前加上/upload_file_oss前缀,所以在这里判断一下。
  48 + /**
  49 + * https://alterego.oss-cn-qingdao.aliyuncs.com/Thumbnails-1731807674577-943%E5%9B%BE%E7%89%871.png 则返回 Thumbnails-1731807674577-943%E5%9B%BE%E7%89%871.png
  50 + * https://alterego.oss-cn-qingdao.aliyuncs.com/upload_file_oss/Thumbnails-1731807674577-943%E5%9B%BE%E7%89%871.pdf 则返回upload_file_oss/Thumbnails-1731807674577-943%E5%9B%BE%E7%89%871.pdf
  51 + * */
  52 + if(url.contains("/upload_file_oss")){
  53 + String path = url.replaceFirst("https://[^/]+/", "");
  54 + try {
  55 + return URLDecoder.decode(path, StandardCharsets.UTF_8.name());
  56 + } catch (UnsupportedEncodingException e) {
  57 + throw new RuntimeException("文件名称解析失败"+e);
  58 + }
  59 + }else{
  60 + String regex = "%[0-9A-Fa-f]{2}";
  61 + Pattern pattern = Pattern.compile(regex);
  62 + String fileName = url.substring(url.lastIndexOf("/") + 1);
  63 + Matcher matcher = pattern.matcher(fileName);
  64 + if(matcher.find()){
  65 + // URL 解码 如果包含中文名称就进行解析,回显中文名称。
  66 + try {
  67 + return URLDecoder.decode(fileName, StandardCharsets.UTF_8.name());
  68 + // 判断解码后的文件名是否是中文字符
  69 + } catch (UnsupportedEncodingException e) {
  70 + throw new RuntimeException("文件名称解析失败:"+e);
  71 + }
  72 + }else{
  73 + return fileName;
  74 + }
  75 + }
  76 + }
  77 + return null;
  78 + }
  79 +}
  80 +
... ...
src/main/java/com/order/erp/controller/AuditController.java
... ... @@ -3,6 +3,7 @@ package com.order.erp.controller;
3 3 import com.order.erp.common.annotation.AnonymousAccess;
4 4 import com.order.erp.common.constant.ServerResult;
5 5 import com.order.erp.domain.AuditStatusEnum;
  6 +import com.order.erp.domain.vo.order.AuditDetailQueryVO;
6 7 import com.order.erp.domain.vo.order.AuditVO;
7 8 import com.order.erp.domain.vo.order.OrderFieldLockApplyQueryVO;
8 9 import com.order.erp.service.order.OrderFieldLockApplyService;
... ... @@ -85,5 +86,18 @@ public class AuditController {
85 86 public ServerResult doAudit(@RequestBody @Validated AuditVO auditVO) {
86 87 return applyService.doAudit(auditVO);
87 88 }
  89 +
  90 + /**
  91 + * 详情
  92 + *
  93 + * @param auditDetailQueryVO 查询条件
  94 + * @return 查询结果
  95 + */
  96 + @ApiOperation("详情接口")
  97 + @PostMapping("/audit_detail")
  98 + @AnonymousAccess
  99 + public ServerResult audit_detail(@RequestBody @Validated AuditDetailQueryVO auditDetailQueryVO) {
  100 + return applyService.audit_detail(auditDetailQueryVO);
  101 + }
88 102 }
89 103  
... ...
src/main/java/com/order/erp/controller/InvoiceBillOrderController.java
... ... @@ -205,8 +205,8 @@ public class InvoiceBillOrderController {
205 205 return invoiceBillOrderService.deleteDeductUrlById(deleteVo);
206 206 }
207 207  
208   - /**
209   - *最后一步,确认是否已经完成最终收款,即使审核通过之后,invoice的状态为已收款,这里的作用是在已收款状态的基础上,最后手动确认是否完成收款。人工校验。
  208 + /** 删除
  209 + *最后一步,确认是否已经完成最终收款,即使审核通过之后,invoice的状态从未收款转化为待收款,,这里的作用是在待收款状态的基础上,最后手动确认是否完成收款。人工校验,状态为已收款。
210 210 * @param invoiceBillDeductInfoVO id
211 211 * @return
212 212 */
... ...
src/main/java/com/order/erp/controller/OrderController.java
... ... @@ -4,6 +4,7 @@ import com.order.erp.common.annotation.AnonymousAccess;
4 4 import com.order.erp.common.constant.ServerResult;
5 5 import com.order.erp.common.excel4j.exceptions.Excel4JException;
6 6 import com.order.erp.common.exception.BusinessException;
  7 +import com.order.erp.domain.vo.AccountStatementVO;
7 8 import com.order.erp.domain.vo.ProducePdfVO;
8 9 import com.order.erp.domain.vo.order.*;
9 10 import com.order.erp.mapper.order.OrderBaseInfoMapper;
... ... @@ -169,17 +170,35 @@ public class OrderController {
169 170 public ServerResult oneTimePassRate(@RequestBody OrderOpinionLogVO orderOpinionLogVO) {
170 171 return orderBaseInfoService.passRate(orderOpinionLogVO);
171 172 }
172   -
  173 + /**
  174 + * 生产指示书
  175 + *
  176 + * @param producePdfVO 生成列表
  177 + *
  178 + */
173 179 @PostMapping("/produceReport")
174 180 public ServerResult produceReport(@RequestBody ProducePdfVO producePdfVO) {
175 181 return orderBaseInfoService.produceReport(producePdfVO);
176 182 }
177   -
  183 + /**
  184 + * 发送生产指示书至邮箱
  185 + *
  186 + * @param producePdfVO 生成列表
  187 + *
  188 + */
178 189 @PostMapping("/send")
179 190 public ServerResult send(@RequestBody ProducePdfVO producePdfVO) throws Exception {
180 191 return orderBaseInfoService.send(producePdfVO);
181 192 }
182   -
183   -
  193 + /**
  194 + * 生产对账单
  195 + *
  196 + * @param accountStatementVO 生成列表
  197 + *
  198 + */
  199 + @PostMapping("/accountStatement")
  200 + public ServerResult accountStatement(HttpServletResponse response,@RequestBody AccountStatementVO accountStatementVO) throws Exception {
  201 + return orderBaseInfoService.accountStatement(response,accountStatementVO);
  202 + }
184 203 }
185 204  
... ...
src/main/java/com/order/erp/controller/ProducePaymentCheckBillOrderController.java
... ... @@ -217,8 +217,8 @@ public class ProducePaymentCheckBillOrderController {
217 217 return producePaymentCheckBillOrderService.deleteDeductUrlById(deleteVo);
218 218 }
219 219  
220   - /**
221   - *最后一步,确认是否已经完成最终收款,即使审核通过之后,invoice的状态为已收款,这里的作用是在已收款状态的基础上,最后手动确认是否完成收款。人工校验。
  220 + /** 删除
  221 + *最后一步,确认是否已经完成最终收款,即使审核通过之后,check的状态从未收款转化为待收款,这里的作用是在已收款状态的基础上,最后手动确认是否完成收款。人工校验,转化为已收款状态。
222 222 * @param producePaymentCheckBillInvoiceInfoVO id
223 223 * @return
224 224 */
... ... @@ -226,6 +226,7 @@ public class ProducePaymentCheckBillOrderController {
226 226 public ServerResult isFinishStatus(@RequestBody ProducePaymentCheckBillInvoiceInfoVO producePaymentCheckBillInvoiceInfoVO) {
227 227 return producePaymentCheckBillOrderService.isFinishStatus(producePaymentCheckBillInvoiceInfoVO);
228 228 }
  229 +
229 230 }
230 231  
231 232  
... ...
src/main/java/com/order/erp/domain/FinanceEnum.java
... ... @@ -16,8 +16,10 @@ public enum FinanceEnum {
16 16 NOT_CREATED(-1,"未创建"),
17 17 //创建了invoice号没有提交审核,或者审核被驳回了。
18 18 UNPAID_PAYMENTS(0,"未收款"),
19   - //审核通过了。
20   - RECEIVED_PAYMENT(10,"已收款"),
  19 + //审核通过了。但是还是叫做待收款。
  20 + RECEIVED_PAYMENT(10,"待收款"),
  21 + //审核通过以后叫做待收款,人工确认之后才会由待收款转化为已收款。
  22 + OK_PAYMENT(40,"已收款"),
21 23 ;
22 24 private Integer status;
23 25  
... ...
src/main/java/com/order/erp/domain/FinanceOverEnum.java
... ... @@ -14,6 +14,10 @@ public enum FinanceOverEnum {
14 14 CHECK_FAIL("你提交的生产科对账单未通过审核","Hi All 你提交的生产科对账单未通过审核,请重新查看原因并提交审核!\n生产科对账单号为: "),
15 15 CHECK_INVOICEURL_PASS("你提交的生产科对账单发票通过审核","Hi All 你提交的生产科对账单发票通过审核,你现在可以提交生产科对账单了!\n生产科对账单号为: "),
16 16 CHECK_INVOICEURL_FAIL("你提交的生产科对账单发票未通过审核","Hi All 你提交的生产科对账单未通过审核,请重新查看原因并提交审核!\n生产科对账单号为: "),
  17 + CHECK_DEDUCTURL_PASS("你提交的生产科扣款单通过审核","Hi All 你提交的生产科扣款单通过审核,你现在可以提交生产科对账单了!\n生产科对账单号为: "),
  18 + CHECK_DEDUCTURL_FAIL("你提交的生产科扣款单未通过审核","Hi All 你提交的生产科扣款单未通过审核,请重新查看原因并提交审核!\n生产科对账单号为: "),
  19 + INVOICE_DEDUCTURL_PASS("你提交的invoice扣款单已通过审核","Hi All 你提交的invoice扣款单已通过审核,请查收!\nInvoice号为: "),
  20 + INVOICE_DEDUCTURL_FAIL("你提交的invoice扣款单未通过审核","Hi All 你提交的invoice扣款单未通过审核,请重新查看原因并提交审核!请查收!\nInvoice号为: "),
17 21 ;
18 22  
19 23 private String title;
... ...
src/main/java/com/order/erp/domain/dto/order/InvoiceBillOrderDO.java
... ... @@ -33,7 +33,7 @@ public class InvoiceBillOrderDO extends BaseDO implements Serializable {
33 33 */
34 34 private Long orderId ;
35 35 /**
36   - * 报关单url地址
  36 + * 报关单url地址 数据库中只存储域名和文件名,不存储accesskey,所以每次获取时都应该拿着文件名去获取实时链接。
37 37 */
38 38 private String bgUrl;
39 39 /**
... ... @@ -50,7 +50,7 @@ public class InvoiceBillOrderDO extends BaseDO implements Serializable {
50 50 */
51 51 private BigDecimal deductAmount;
52 52 /**
53   - * 扣款单url地址
  53 + * 扣款单url地址 数据库中只存储域名和文件名,不存储accesskey,所以每次获取时都应该拿着文件名去获取实时链接。
54 54 */
55 55 private String deductUrl;
56 56 /**
... ... @@ -74,7 +74,7 @@ public class InvoiceBillOrderDO extends BaseDO implements Serializable {
74 74 */
75 75 private BigDecimal otherAmount;
76 76 /**
77   - * 状态 -1:未创建、0:未收款,10:已收款
  77 + * 状态 -1:未创建、0:未收款,10:待收款 20:已收款
78 78 */
79 79 private Integer status;
80 80 //需要在表中添加字段。
... ... @@ -109,8 +109,9 @@ public class InvoiceBillOrderDO extends BaseDO implements Serializable {
109 109 * */
110 110 private String notes;
111 111  
  112 +
112 113 /**
113   - * 最终完成状态,需要手动确认 状态 0:未完成,10:已完成
  114 + * 扣款单状态 状态 0:待审批,10:已通过 20:已驳回
114 115 * */
115   - private Integer finishStatus;
  116 + private Integer invoiceDeductUrlStatus;
116 117 }
... ...
src/main/java/com/order/erp/domain/dto/order/OrderBaseInfoDO.java
... ... @@ -64,12 +64,12 @@ public class OrderBaseInfoDO extends BaseDO implements Serializable {
64 64 * 颜色中文
65 65 */
66 66 private String cnColor;
67   - /**
68   - * pic图片地址
  67 + /**0
  68 + * pic图片地址 数据库中只存储域名和文件名,不存储accesskey,所以每次获取时都应该拿着文件名去获取实时链接。
69 69 */
70 70 private String picUrl;
71 71 /**
72   - * 缩略图地址
  72 + * 缩略图地址 数据库中只存储域名和文件名,不存储accesskey,所以每次获取时都应该拿着文件名去获取实时链接。
73 73 */
74 74 private String smallPicUrl;
75 75 /**
... ...
src/main/java/com/order/erp/domain/dto/order/ProducePaymentCheckBillOrderDO.java
... ... @@ -34,11 +34,11 @@ public class ProducePaymentCheckBillOrderDO extends BaseDO implements Serializab
34 34 */
35 35 private Long orderId;
36 36 /**
37   - * 发票url地址
  37 + * 发票url地址 数据库中只存储域名和文件名,不存储accesskey,所以每次获取时都应该拿着文件名去获取实时链接。
38 38 */
39 39 private String invoiceUrl;
40 40 /**
41   - * 扣款单url地址
  41 + * 扣款单url地址 数据库中只存储域名和文件名,不存储accesskey,所以每次获取时都应该拿着文件名去获取实时链接。
42 42 */
43 43 private String deductUrl;
44 44 /**
... ... @@ -118,9 +118,9 @@ public class ProducePaymentCheckBillOrderDO extends BaseDO implements Serializab
118 118 * */
119 119 private String notes;
120 120 /**
121   - * 最终完成状态,需要手动确认 状态 0:未完成,10:已完成
  121 + * 扣款单状态 0:待审核 10:已通过 20:已驳回
122 122 * */
123   - private Integer finishStatus;
  123 + private Integer checkDeductUrlStatus;
124 124  
125 125  
126 126 }
... ...
src/main/java/com/order/erp/domain/excel/AccountStatementExcelVO.java 0 → 100644
  1 +package com.order.erp.domain.excel;
  2 +
  3 +import lombok.*;
  4 +import lombok.experimental.SuperBuilder;
  5 +
  6 +import java.util.HashMap;
  7 +import java.util.List;
  8 +
  9 +@Data
  10 +@AllArgsConstructor
  11 +@ToString
  12 +@NoArgsConstructor
  13 +@EqualsAndHashCode(callSuper = false)
  14 +@SuperBuilder
  15 +public class AccountStatementExcelVO {
  16 +
  17 + /**
  18 + * 生产科
  19 + */
  20 + private String productionDepartment;
  21 +
  22 + /**
  23 + * 内部编号
  24 + */
  25 + private String innerNo;
  26 +
  27 + /**
  28 + * 客户po号(客户订单号)
  29 + */
  30 + private String customerPo;
  31 +
  32 + /**
  33 + * 客户STYLE#(客户款号)
  34 + */
  35 + private String customerStyle;
  36 + /**
  37 + * Modelo(REFERENCE)
  38 + */
  39 + private String modeleLo;
  40 + /**
  41 + * 颜色中文
  42 + */
  43 + private String cnColor;
  44 +
  45 + /**
  46 + * pic图片地址(订单图片)
  47 + */
  48 + private String smallPicUrl;
  49 +
  50 + /**
  51 + * 订单数量
  52 + */
  53 + private Integer orderCount;
  54 +
  55 + /**
  56 + * 生成科拖货时间(生产科交期)
  57 + */
  58 + private String productionDepartmentConsignTime;
  59 +
  60 + /**
  61 + * 包装类型
  62 + */
  63 + private String packetType;
  64 +
  65 + /**
  66 + * 生成科单价¥
  67 + */
  68 + private Double productionDepartmentPrice;
  69 +
  70 + /**
  71 + * 生成科总价¥
  72 + */
  73 + private Double productionDepartmentTotalPrice;
  74 +
  75 + /**
  76 + * 代垫费用
  77 + * */
  78 + private List<HashMap<String,Double>> disbursement;
  79 +
  80 + /**
  81 + * 扣款项目
  82 + * */
  83 +
  84 + private List<HashMap<String,Double>> deduction;
  85 + /**
  86 + * 公司名称
  87 + * */
  88 + private String titleCompany;
  89 +
  90 +}
... ...
src/main/java/com/order/erp/domain/vo/AccountStatementVO.java 0 → 100644
  1 +package com.order.erp.domain.vo;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Data;
  5 +import lombok.NoArgsConstructor;
  6 +import lombok.ToString;
  7 +
  8 +import java.util.HashMap;
  9 +import java.util.List;
  10 +
  11 +@Data
  12 +@AllArgsConstructor
  13 +@NoArgsConstructor
  14 +@ToString
  15 +public class AccountStatementVO {
  16 + /**
  17 + * 订单id。
  18 + * */
  19 + private List<Long> ids;
  20 + /**
  21 + * 代垫费用
  22 + * */
  23 + private List<HashMap<String,Double>> disbursement;
  24 + /**
  25 + * 扣款项目
  26 + * */
  27 +
  28 + private List<HashMap<String,Double>> deduction;
  29 + /**
  30 + * 公司名称
  31 + * */
  32 +
  33 + private String titleCompany;
  34 +}
... ...
src/main/java/com/order/erp/domain/vo/ImageRespVO.java
... ... @@ -27,4 +27,12 @@ public class ImageRespVO implements Serializable {
27 27 * 缩略图地址
28 28 */
29 29 private String smallPicUrl;
  30 + /**
  31 + * 文件name。
  32 + */
  33 + private String fileName;
  34 + /**
  35 + * 缩略图文件name。
  36 + */
  37 + private String SmallfileName;
30 38 }
... ...
src/main/java/com/order/erp/domain/vo/order/AuditDetailQueryVO.java 0 → 100644
  1 +package com.order.erp.domain.vo.order;
  2 +
  3 +import lombok.*;
  4 +import lombok.experimental.SuperBuilder;
  5 +@Data
  6 +@AllArgsConstructor
  7 +@ToString
  8 +@NoArgsConstructor
  9 +@EqualsAndHashCode(callSuper = false)
  10 +@SuperBuilder
  11 +public class AuditDetailQueryVO {
  12 +
  13 + /**
  14 + * 申请id
  15 + */
  16 + private Long id;
  17 +}
... ...
src/main/java/com/order/erp/domain/vo/order/CheckBillResultVO.java 0 → 100644
  1 +package com.order.erp.domain.vo.order;
  2 +
  3 +import lombok.*;
  4 +import lombok.experimental.SuperBuilder;
  5 +
  6 +import java.math.BigDecimal;
  7 +
  8 +@Data
  9 +@AllArgsConstructor
  10 +@ToString
  11 +@NoArgsConstructor
  12 +@EqualsAndHashCode(callSuper = false)
  13 +@SuperBuilder
  14 +public class CheckBillResultVO {
  15 + /**
  16 + * id
  17 + */
  18 + private Long id;
  19 + /**
  20 + * orderId
  21 + */
  22 + private Long orderId;
  23 + /**
  24 + * 项目号
  25 + */
  26 + private String projectNo;
  27 + /**
  28 + * 生产科
  29 + */
  30 + private String productionDepartment;
  31 + /**
  32 + * 内部编号
  33 + */
  34 + private String innerNo;
  35 + /**
  36 + * 缩略图片地址 这里不确认前端拿到的数据是缩略图url还是图片url,先采用缩略图url。
  37 + */
  38 + private String smallPicUrl;
  39 + /**
  40 + * 数量
  41 + */
  42 + private Integer orderCount;
  43 + /**
  44 + * Modelo(REFERENCE)
  45 + */
  46 + private String modeleLo;
  47 + /**
  48 + * 生产科单价
  49 + */
  50 + private Double productionDepartmentPrice;
  51 + /**
  52 + * 生产科总价
  53 + */
  54 + private Double productionDepartmentTotalPrice;
  55 + /**
  56 + * 生产科对账单
  57 + */
  58 + private String checkNo;
  59 + /**
  60 + * 生产科必须回款日期
  61 + */
  62 + private String payedDate;
  63 + /**
  64 + * 生产科扣款金额
  65 + */
  66 + private BigDecimal deductAmount;
  67 + /**
  68 + * 生产科扣款责任部门
  69 + */
  70 + private String deductDept;
  71 + /**
  72 + * 扣款单url地址
  73 + */
  74 + private String deductUrl;
  75 + /**
  76 + * 实际应付金额
  77 + */
  78 + private BigDecimal actualPayedAmount;
  79 + /**
  80 + * 发票url地址
  81 + */
  82 + private String invoiceUrl;
  83 + /**
  84 + * 实际应付金额1
  85 + */
  86 + private BigDecimal actualPayedAmount1;
  87 + /**
  88 + * 实际应付金额2
  89 + */
  90 + private BigDecimal actualPayedAmount2;
  91 + /**
  92 + * 实际应付金额3
  93 + */
  94 + private BigDecimal actualPayedAmount3;
  95 + /**
  96 + * 备注。
  97 + * */
  98 + private String notes;
  99 +}
... ...
src/main/java/com/order/erp/domain/vo/order/DeductionUrlFieldVO.java 0 → 100644
  1 +package com.order.erp.domain.vo.order;
  2 +
  3 +import lombok.*;
  4 +import lombok.experimental.SuperBuilder;
  5 +
  6 +import java.math.BigDecimal;
  7 +
  8 +@Data
  9 +@AllArgsConstructor
  10 +@ToString
  11 +@NoArgsConstructor
  12 +@EqualsAndHashCode(callSuper = false)
  13 +@SuperBuilder
  14 +public class DeductionUrlFieldVO {
  15 + /**
  16 + * 订单id,。
  17 + */
  18 + private Long id;
  19 + /**
  20 + * 内部编号。
  21 + */
  22 + private String innerNo;
  23 + /**
  24 + * 发票单号
  25 + */
  26 + private String invoiceNo;
  27 +
  28 + /**
  29 + * 跟单员
  30 + * */
  31 + private String trackerUser;
  32 + /**
  33 + * 业务员
  34 + * */
  35 + private String businesPerson;
  36 + /**
  37 + * 财务人员
  38 + * */
  39 + private String financePerson;
  40 +
  41 + /**
  42 + * 生产科对账单
  43 + */
  44 + private String checkNo;
  45 +
  46 + /**
  47 + * 生产科
  48 + * */
  49 + private String productionName;
  50 +
  51 + /**
  52 + * 扣款单
  53 + * */
  54 + private String deductUrl;
  55 + /**
  56 + * 扣款金额
  57 + * */
  58 + private BigDecimal deductAmount;
  59 +}
... ...
src/main/java/com/order/erp/domain/vo/order/FinanceOrderResultVO.java
... ... @@ -86,6 +86,10 @@ public class FinanceOrderResultVO extends OrderBaseInfoVO {
86 86 */
87 87 private String invoiceDeductUrl;
88 88 /**
  89 + * 扣款单状态状态。0:待审核 10:已通过 20:已驳回
  90 + * */
  91 + private Integer invoiceDeductUrlStatus;
  92 + /**
89 93 * 实际应收金额
90 94 */
91 95 private BigDecimal invoiceActualReceivableAmount;
... ... @@ -114,10 +118,6 @@ public class FinanceOrderResultVO extends OrderBaseInfoVO {
114 118 * 备注信息
115 119 * */
116 120 private String invoiceNotes;
117   - /**
118   - * 最终确认,0:未完成 10:已完成
119   - * */
120   - private Integer invoiceFinishStatus;
121 121  
122 122 //应付款信息
123 123 // private ProducePaymentCheckBillOrderDO producePaymentCheckBillOrderDO;
... ... @@ -154,6 +154,10 @@ public class FinanceOrderResultVO extends OrderBaseInfoVO {
154 154 */
155 155 private BigDecimal checkDeductAmount;
156 156 /**
  157 + * 扣款单状态状态。0:待审核 10:已通过 20:已驳回
  158 + * */
  159 + private Integer checkDeductUrlStatus;
  160 + /**
157 161 * 实际应付金额
158 162 */
159 163 private BigDecimal checkActualPayedAmount;
... ... @@ -182,10 +186,6 @@ public class FinanceOrderResultVO extends OrderBaseInfoVO {
182 186 * 备注。
183 187 * */
184 188 private String checkNotes;
185   - /**
186   - * 最终确认状态。0:未完成 10:已完成
187   - * */
188   - private Integer checkFinishStatus;
189 189  
190 190  
191 191 //利润信息
... ...
src/main/java/com/order/erp/domain/vo/order/InvoiceAndCheckBillSendEmailVO.java
... ... @@ -24,6 +24,12 @@ public class InvoiceAndCheckBillSendEmailVO {
24 24 private ProducePaymentCheckBillOrderDO checkBillOrderDO;
25 25  
26 26 /**
  27 + * 扣款单
  28 + * */
  29 +
  30 + private DeductionUrlFieldVO deductionUrlFieldVO;
  31 +
  32 + /**
27 33 * 拒绝原因
28 34 * */
29 35 private String refuseRemark;
... ...
src/main/java/com/order/erp/domain/vo/order/InvoiceBillOrderQueryVO.java
... ... @@ -121,14 +121,6 @@ public class InvoiceBillOrderQueryVO extends BasePageVO implements Serializable
121 121 */
122 122 private String businessUserName;
123 123  
124   - /**
125   - * 最终确认状态 0:未完成,10:已完成
126   - */
127   - private Integer invoiceFinishStatus;
128   - /**
129   - * 最终确认状态 0:未完成,10:已完成
130   - */
131   - private Integer checkFinishStatus;
132 124  
133 125 }
134 126  
... ...
src/main/java/com/order/erp/domain/vo/order/InvoiceFieldVO.java
... ... @@ -20,7 +20,7 @@ public class InvoiceFieldVO {
20 20 */
21 21 private List<Long> invoiceId;
22 22 /**
23   - * 订单id,这里取选中多个集合中的第第一个id作为申请id
  23 + * 内部编号
24 24 */
25 25 private List<String> innerNo;
26 26 /**
... ...
src/main/java/com/order/erp/domain/vo/order/InvoiceResultVO.java 0 → 100644
  1 +package com.order.erp.domain.vo.order;
  2 +
  3 +import lombok.*;
  4 +import lombok.experimental.SuperBuilder;
  5 +
  6 +import java.math.BigDecimal;
  7 +
  8 +@Data
  9 +@AllArgsConstructor
  10 +@ToString
  11 +@NoArgsConstructor
  12 +@EqualsAndHashCode(callSuper = false)
  13 +@SuperBuilder
  14 +public class InvoiceResultVO {
  15 + /**
  16 + * id
  17 + */
  18 + private Long id;
  19 + /**
  20 + * orderId
  21 + */
  22 + private Long orderId;
  23 +
  24 + /**
  25 + * 项目号
  26 + */
  27 + private String projectNo;
  28 + /**
  29 + * 生产科
  30 + */
  31 + private String productionDepartment;
  32 + /**
  33 + * 内部编号
  34 + */
  35 + private String innerNo;
  36 + /**
  37 + * 缩略图片地址 这里不确认前端拿到的数据是缩略图url还是图片url,先采用缩略图url。
  38 + */
  39 + private String smallPicUrl;
  40 + /**
  41 + * 数量
  42 + */
  43 + private Integer orderCount;
  44 + /**
  45 + * Modelo(REFERENCE)
  46 + */
  47 + private String modeleLo;
  48 + /**
  49 + * 客户单价$
  50 + */
  51 + private Double customerPrice;
  52 + /**
  53 + * 客户总价$
  54 + */
  55 + private Double customerTotalPrice;
  56 + /**
  57 + * 发票单号
  58 + */
  59 + private String invoiceNo;
  60 + /**
  61 + * 报关单url地址
  62 + */
  63 + private String bgUrl;
  64 + /**
  65 + * 必须回款日期
  66 + */
  67 + private String backRefundDate;
  68 + /**
  69 + * 发生扣款金额
  70 + */
  71 + private BigDecimal deductAmount;
  72 + /**
  73 + * 扣款单url地址
  74 + */
  75 + private String deductUrl;
  76 + /**
  77 + * 实际应收金额
  78 + */
  79 + private BigDecimal actualReceivableAmount;
  80 + /**
  81 + * 实际应付金额1
  82 + */
  83 + private BigDecimal actualPayedAmount1;
  84 + /**
  85 + * 实际应付金额2
  86 + */
  87 + private BigDecimal actualPayedAmount2;
  88 + /**
  89 + * 实际应付金额3
  90 + */
  91 + private BigDecimal actualPayedAmount3;
  92 + /**
  93 + * 其他费用金额
  94 + */
  95 + private BigDecimal otherAmount;
  96 + /**
  97 + * 备注信息
  98 + * */
  99 + private String notes;
  100 +
  101 +}
... ...
src/main/java/com/order/erp/domain/vo/order/OrderBaseInfoVO.java
... ... @@ -80,6 +80,15 @@ public class OrderBaseInfoVO implements Serializable {
80 80 */
81 81 private String smallPicUrl;
82 82 /**
  83 + * pic图片名称
  84 + */
  85 + private String fileName;
  86 +
  87 + /**
  88 + * 缩略图片名称
  89 + */
  90 + private String smallFileName;
  91 + /**
83 92 * 生产要求
84 93 */
85 94 private String productionComment;
... ...
src/main/java/com/order/erp/domain/vo/order/OrderLockFieldVO.java
... ... @@ -48,10 +48,11 @@ public class OrderLockFieldVO implements Serializable {
48 48 /**
49 49 * 应收款账单字段
50 50 */
51   -// private List<InvoiceBillOrderDO> invoiceBillOrderDOList;
52 51  
53 52 private InvoiceFieldVO invoiceFieldVO;
54 53  
  54 + //这个专门给扣款单使用(应收和应付都可以使用)。
  55 + private DeductionUrlFieldVO deductionUrlFieldVO;
55 56 /**
56 57 * 应付款账单字段
57 58 */
... ...
src/main/java/com/order/erp/job/OrderJob.java
... ... @@ -6,10 +6,12 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
6 6 import com.order.erp.common.constant.Constant;
7 7 import com.order.erp.common.utils.DateUtils;
8 8 import com.order.erp.common.utils.TransactionHelper;
  9 +import com.order.erp.domain.ApplyStatusEnum;
9 10 import com.order.erp.domain.OrderStatusEnum;
10 11 import com.order.erp.domain.dto.BaseDO;
11 12 import com.order.erp.domain.dto.order.*;
12 13 import com.order.erp.domain.vo.order.OrderInfoResultVO;
  14 +import com.order.erp.mapper.order.OrderBaseInfoMapper;
13 15 import com.order.erp.service.order.*;
14 16 import lombok.extern.slf4j.Slf4j;
15 17 import org.joda.time.DateTime;
... ... @@ -17,10 +19,8 @@ import org.springframework.scheduling.annotation.Scheduled;
17 19 import org.springframework.stereotype.Component;
18 20  
19 21 import javax.annotation.Resource;
20   -import java.util.List;
21   -import java.util.Map;
22   -import java.util.Objects;
23   -import java.util.Set;
  22 +import java.time.LocalDate;
  23 +import java.util.*;
24 24 import java.util.stream.Collectors;
25 25  
26 26 /**
... ... @@ -65,10 +65,17 @@ public class OrderJob {
65 65 .le(OrderBaseInfoDO::getCreateTime, DateUtils.format(DateTime.now().toDate(), DateUtils.DATE_TIME))
66 66 .ne(OrderBaseInfoDO::getOrderStatus, OrderStatusEnum.ORDER_FINISH.getStatus());
67 67 List<OrderBaseInfoDO> ordersDOS = orderBaseInfoService.list(queryWrapper);
68   -//如果都填充完成为 1.25,如果只填写4个,则为1。 这里面的方法是否是要改成,只要对应的跟单,质检任何一个格子填写了数据,就算上完成就加一。
69 68 List<OrderInfoResultVO> orderInfoResultVOS = orderBaseInfoService.wrapperOrderResultList(false, ordersDOS);
70   - if (CollectionUtils.isNotEmpty(orderInfoResultVOS)) {
71   - Set<Long> orderIds = orderInfoResultVOS.stream().filter(x -> Objects.nonNull(x.getSchedule()) && Constant.ONE <= x.getSchedule()).map(OrderInfoResultVO::getId).collect(Collectors.toSet());
  69 + //遍历一下这个集合的数据,如果尾期尾期验货结果为PASS,pass 2ND,PASS 3ND,FAIL RELEASE就为订单完成。
  70 + Set<String> validResults = new HashSet<>(Arrays.asList("PASS", "PASS 2ND", "PASS 3RD", "FAIL RELEASE"));
  71 + List<OrderInfoResultVO> filteredOrders = orderInfoResultVOS.stream()
  72 + .filter(order -> order.getInspectionStageInfo() != null &&
  73 + validResults.contains(order.getInspectionStageInfo().getEndCheckResult()))
  74 + .collect(Collectors.toList());
  75 + if (CollectionUtils.isNotEmpty(filteredOrders)) {
  76 + Set<Long> orderIds = filteredOrders.stream().map(OrderInfoResultVO::getId).collect(Collectors.toSet());
  77 +
  78 + //不再使用上述的方式,
72 79 if (CollectionUtils.isNotEmpty(orderIds)) {
73 80 LambdaUpdateWrapper<OrderBaseInfoDO> orderBaseUpdateWrapper = new LambdaUpdateWrapper<OrderBaseInfoDO>()
74 81 .in(OrderBaseInfoDO::getId, orderIds).set(OrderBaseInfoDO::getOrderStatus, OrderStatusEnum.ORDER_FINISH.getStatus());
... ... @@ -213,4 +220,47 @@ public class OrderJob {
213 220 log.info("执行结束时间:{}", DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
214 221 }
215 222  
  223 +
  224 +//重新扫描一遍,扫描规则为:不扫描所有表,只扫描25年的数据,如果尾期验货为PASS,PASS 2DN,PASS 3ND,或者为FAIL RELEASE,那么它就设置为订单完成状态。并且,如果这个订单设置为订单完成状态。去看看这些订单是否存在相同的
  225 + //project_no和inner_no,如果存在就进行也设置为订单完成。
  226 +
  227 +
  228 +
  229 +
  230 +
  231 + //这里需要改成某个时间段只执行一次。
  232 +//@Scheduled(cron = "0 */5 * * * ?")
  233 +public void orderStatusFinishCheck() {
  234 + LocalDate localDate = LocalDate.of(2023, 10, 1);
  235 + //查询2023年末之后的基础订单订单。
  236 + List<OrderBaseInfoDO> orderBaseInfoDOS = orderBaseInfoService.list(new LambdaQueryWrapper<OrderBaseInfoDO>().eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  237 + .ge(OrderBaseInfoDO::getCreateTime, localDate));
  238 + List<Long> orderIds = orderBaseInfoDOS.stream().map(orderBaseInfoDO -> orderBaseInfoDO.getId()).collect(Collectors.toList());
  239 + //先把状态设置为跟单中。(因为现在很多虚假的订单完成状态,所以现在把这些订单设置为跟单中,然后重新扫描过滤。)
  240 + orderBaseInfoDOS.forEach(orderBaseInfoDO ->
  241 + orderBaseInfoDO.setOrderStatus(OrderStatusEnum.TRACK_ING.getStatus()));
  242 + orderBaseInfoService.updateBatchById(orderBaseInfoDOS);
  243 +
  244 +
  245 + //查询质检信息。
  246 + List<OrderInspectionStageDO> inspectionStageDOList = inspectionStageService.list(new LambdaQueryWrapper<OrderInspectionStageDO>().eq(BaseDO::getEnableFlag,Constant.ENABLE_TEN).in(OrderInspectionStageDO::getOrderId,orderIds));
  247 +
  248 + Set<String> validResults = new HashSet<>(Arrays.asList("PASS", "PASS 2ND", "PASS 3RD", "FAIL RELEASE"));
  249 +
  250 + List<OrderInspectionStageDO> filteredList = inspectionStageDOList.stream()
  251 + .filter(order -> order.getEndCheckResult() != null && validResults.contains(order.getEndCheckResult()))
  252 + .collect(Collectors.toList());
  253 + List<OrderBaseInfoDO> orderBaseInfoDOList = orderBaseInfoService.listByIds(filteredList.stream().map(OrderInspectionStageDO::getOrderId).collect(Collectors.toList()));
  254 +
  255 + Set<String> uniqueCombinations=orderBaseInfoDOList.stream().map(order -> order.getProjectNo()+"-"+order.getInnerNo()).collect(Collectors.toSet());
  256 +
  257 + List<OrderBaseInfoDO> finishStatusOrderBaseinfoList = orderBaseInfoDOS.stream().filter(order -> {
  258 + String combination = order.getProjectNo() + "-" + order.getInnerNo();
  259 + return uniqueCombinations.contains(combination);
  260 + })
  261 + .collect(Collectors.toList());
  262 + finishStatusOrderBaseinfoList.forEach(orderBaseInfoDO -> orderBaseInfoDO.setOrderStatus(OrderStatusEnum.ORDER_FINISH.getStatus()));
  263 + orderBaseInfoService.updateBatchById(finishStatusOrderBaseinfoList);
  264 + }
  265 +
216 266 }
... ...
src/main/java/com/order/erp/job/OrderOverTimeEventJob.java
... ... @@ -23,6 +23,7 @@ import com.order.erp.service.admin.AdminUserRoleService;
23 23 import com.order.erp.service.admin.AdminUserService;
24 24 import com.order.erp.service.order.*;
25 25 import lombok.extern.slf4j.Slf4j;
  26 +import org.joda.time.DateTime;
26 27 import org.springframework.scheduling.annotation.Scheduled;
27 28 import org.springframework.stereotype.Component;
28 29 import org.w3c.dom.events.Event;
... ... @@ -139,6 +140,7 @@ public class OrderOverTimeEventJob {
139 140 OrderBaseInfoVO orderBaseInfoFormat = getDateFormat(orderEventJob.getBaseInfo().getProductionDepartmentConsignTime(), orderEventJob.getBaseInfo().getOrderHodTime());
140 141 orderEventJob.getBaseInfo().setProductionDepartmentConsignTime(orderBaseInfoFormat.getProductionDepartmentConsignTime());
141 142 orderEventJob.getBaseInfo().setOrderHodTime(orderBaseInfoFormat.getOrderHodTime());
  143 + orderEventJob.getBaseInfo().setSmallPicUrl(AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(orderEventJob.getBaseInfo().getSmallPicUrl()), SplitUrlGetBucketName.getFileName(orderEventJob.getBaseInfo().getSmallPicUrl()), new DateTime().plusYears(Constant.ENABLE_TEN).toDate()));
142 144 String productionDepartment = orderEventJob.getBaseInfo().getProductionDepartment();
143 145 //根据订单的生产科得到生产科用户信息。
144 146 AdminUserDO productionDepartmentUser = adminUserService.getOne(new LambdaQueryWrapper<AdminUserDO>()
... ... @@ -230,6 +232,7 @@ public class OrderOverTimeEventJob {
230 232 OrderBaseInfoVO orderBaseInfoFormat = getDateFormat(orderEventJob.getBaseInfo().getProductionDepartmentConsignTime(), orderEventJob.getBaseInfo().getOrderHodTime());
231 233 orderEventJob.getBaseInfo().setProductionDepartmentConsignTime(orderBaseInfoFormat.getProductionDepartmentConsignTime());
232 234 orderEventJob.getBaseInfo().setOrderHodTime(orderBaseInfoFormat.getOrderHodTime());
  235 + orderEventJob.getBaseInfo().setSmallPicUrl(AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(orderEventJob.getBaseInfo().getSmallPicUrl()), SplitUrlGetBucketName.getFileName(orderEventJob.getBaseInfo().getSmallPicUrl()), new DateTime().plusYears(Constant.ENABLE_TEN).toDate()));
233 236 emailSendUtils.sendEmail(EmailTemplateEnum.byTemplate(eventEnum.getTemplateId()),
234 237 map.get(map.keySet().iterator().next()), orderEventJob);
235 238 redisUtils.set(EmailTemplateEnum.byTemplate(
... ...
src/main/java/com/order/erp/mapper/order/OrderBaseInfoMapper.java
... ... @@ -49,21 +49,19 @@ public interface OrderBaseInfoMapper extends BaseMapper&lt;OrderBaseInfoDO&gt; {
49 49  
50 50 @Select("SELECT YEAR(obi.create_time) AS date, SUM(opa.customer_total_price) AS totalPrice FROM order_base_info obi JOIN order_profit_analysis opa ON opa.order_id = obi.id AND opa.enable_flag = 10 WHERE obi.enable_flag = 10 GROUP BY YEAR(obi.create_time) ORDER BY date;")
51 51 List<DateYearMonthTimeVO> countRecentYearByOrderStatus();
52   - @Select("SELECT count(*) AS count FROM order_base_info WHERE order_status=#{orderStatus} and enable_flag=10;")
53   - long countAllYearByOrderStatus(Integer orderStatus);
  52 +
  53 + long countAllYearByOrderStatus(@Param("orderStatus") Integer orderStatus);
54 54 List<DateYearMonthTimeVO> countRecentMonthValueByOrderStatus(List<Integer> years);
55   - @Select("SELECT count(*) FROM order_base_info WHERE enable_flag=10;")
  55 +
56 56 long countRecentYearByOrderInit();
57   - @Select("SELECT count(*) AS count FROM order_base_info WHERE enable_flag=10 AND create_time >= #{startOfYear} AND create_time < #{endOfYear};")
58   - long countRecentMonthValueByOrderInit(LocalDate startOfYear, LocalDate endOfYear);
59   - @Select("SELECT count(*) AS count FROM order_base_info WHERE order_status=#{orderStatus} and enable_flag=10 AND create_time >= #{startOfYear} AND create_time < #{endOfYear};")
60   - long countAllMonthByOrderStatus(Integer orderStatus,LocalDate startOfYear,LocalDate endOfYear);
  57 + long countRecentMonthValueByOrderInit(@Param("dataYear") Long dataYear);
  58 + long countAllMonthByOrderStatus(@Param("orderStatus") Integer orderStatus,@Param("dataYear") Long dataYear);
61 59 @Select("SELECT DATE(obi.create_time) AS date,SUM(opa.customer_total_price) AS totalPrice FROM order_base_info obi JOIN order_profit_analysis opa ON opa.order_id=obi.id AND opa.enable_flag = 10 WHERE obi.enable_flag = 10 AND obi.create_time >=#{startDate} AND obi.create_time < #{endDate} GROUP BY DATE(obi.create_time) ORDER BY date;")
62 60 List<DateYearMonthTimeVO> countRecentDayvalueByOrderStatus(LocalDate startDate, LocalDate endDate);
63   - @Select("SELECT count(*) AS count FROM order_base_info WHERE order_status=#{orderStatus} AND enable_flag=10 AND create_time >= #{startDate} AND create_time < #{endDate};")
64   - long countAllDayvalueByOrderStatus(Integer orderStatus, LocalDate startDate, LocalDate endDate);
65   - @Select("SELECT count(*) AS count FROM order_base_info WHERE enable_flag=10 AND create_time >= #{startDate} AND create_time < #{endDate};")
66   - long countRecentDayByOrderInit(LocalDate startDate, LocalDate endDate);
  61 +
  62 + long countAllDayvalueByOrderStatus(@Param("orderStatus") Integer orderStatus, @Param("startDate") LocalDate startDate,@Param("endDate") LocalDate endDate,@Param("year") Long year);
  63 +
  64 + long countRecentDayByOrderInit(@Param("startDate") LocalDate startDate,@Param("endDate") LocalDate endDate,@Param("year") Long year);
67 65 List<OrderBaseInfoDO> sameAttributeOrder(@Param("customerStyle") String customerStyle,
68 66 @Param("innerNo") String innerNo,
69 67 @Param("isReturnOrder") String isReturnOrder,
... ...
src/main/java/com/order/erp/service/impl/LocalStorageServiceImpl.java
... ... @@ -61,7 +61,7 @@ public class LocalStorageServiceImpl extends ServiceImpl&lt;LocalStorageMapper, Loc
61 61 try {
62 62 File tempFile = new File(path + "files" + File.separator + tempFileName);
63 63 if (AliOssUtil.upload(AliOssConfig.ALIYUN_BUCKET, fileName, file.getBytes())) {
64   - String fileUrl = AliOssUtil.createUrl(AliOssConfig.ALIYUN_BUCKET, fileName, new DateTime().plusYears(Constant.ENABLE_TEN).toDate());
  64 + String fileUrl = AliOssUtil.createUrl(AliOssConfig.ALIYUN_BUCKET, fileName, new DateTime().plusHours(Constant.TWO).toDate());
65 65 fileRespVO.setFileUrl(fileUrl);
66 66 FileUtil.del(tempFile);
67 67 }
... ... @@ -72,6 +72,8 @@ public class LocalStorageServiceImpl extends ServiceImpl&lt;LocalStorageMapper, Loc
72 72 }
73 73 }
74 74  
  75 +
  76 + //oss
75 77 @Override
76 78 public ServerResult uploadByAliOss(String name, MultipartFile file) {
77 79 FileUtil.checkSize(maxSize, file.getSize());
... ... @@ -81,13 +83,15 @@ public class LocalStorageServiceImpl extends ServiceImpl&lt;LocalStorageMapper, Loc
81 83 try {
82 84 File tempFile = new File(path + "images" + File.separator + tempFileName);
83 85 if (AliOssUtil.upload(AliOssConfig.ALIYUN_BUCKET, fileName, file.getBytes())) {
84   - String originImageUrl = AliOssUtil.createUrl(AliOssConfig.ALIYUN_BUCKET, fileName, new DateTime().plusYears(Constant.ENABLE_TEN).toDate());
  86 + String originImageUrl = AliOssUtil.createUrl(AliOssConfig.ALIYUN_BUCKET, fileName, new DateTime().plusHours(Constant.TWO).toDate());
85 87 imageRespVO.setPicUrl(originImageUrl);
  88 + imageRespVO.setFileName(fileName);
86 89 // 生成缩略图
87 90 Thumbnails.of(file.getInputStream()).size(100, 100).toFile(tempFile);
88 91 if (AliOssUtil.upload(AliOssConfig.ALIYUN_BUCKET, tempFileName, FileUtil.readBytes(tempFile))) {
89   - String thumbnailImageUrl = AliOssUtil.createUrl(AliOssConfig.ALIYUN_BUCKET, tempFileName, new DateTime().plusYears(Constant.ENABLE_TEN).toDate());
90   - imageRespVO.setSmallPicUrl(thumbnailImageUrl);
  92 + String thumbnailImageUrl = AliOssUtil.createUrl(AliOssConfig.ALIYUN_BUCKET, tempFileName, new DateTime().plusHours(Constant.TWO).toDate());
  93 + imageRespVO.setSmallPicUrl(thumbnailImageUrl);
  94 + imageRespVO.setSmallfileName(tempFileName);
91 95 }
92 96 FileUtil.del(tempFile);
93 97 }
... ...
src/main/java/com/order/erp/service/order/OrderBaseInfoService.java
... ... @@ -6,6 +6,7 @@ import com.order.erp.common.constant.ServerResult;
6 6 import com.order.erp.common.excel4j.exceptions.Excel4JException;
7 7 import com.order.erp.domain.dto.order.OrderBaseInfoDO;
8 8 import com.order.erp.domain.dto.order.QuerySalesStatisticeDO;
  9 +import com.order.erp.domain.vo.AccountStatementVO;
9 10 import com.order.erp.domain.vo.ProducePdfVO;
10 11 import com.order.erp.domain.vo.order.*;
11 12 import freemarker.template.TemplateException;
... ... @@ -131,4 +132,6 @@ public interface OrderBaseInfoService extends IService&lt;OrderBaseInfoDO&gt; {
131 132 ServerResult countByYear(DateTimeVO dateTimeVO);
132 133  
133 134 ServerResult countByDate(DateTimeVO dateTimeVO);
  135 +
  136 + ServerResult accountStatement(HttpServletResponse response,AccountStatementVO accountStatementVO) throws IOException;
134 137 }
... ...
src/main/java/com/order/erp/service/order/OrderFieldLockApplyService.java
... ... @@ -3,6 +3,7 @@ package com.order.erp.service.order;
3 3 import com.baomidou.mybatisplus.extension.service.IService;
4 4 import com.order.erp.common.constant.ServerResult;
5 5 import com.order.erp.domain.dto.order.OrderFieldLockApplyDO;
  6 +import com.order.erp.domain.vo.order.AuditDetailQueryVO;
6 7 import com.order.erp.domain.vo.order.AuditVO;
7 8 import com.order.erp.domain.vo.order.OrderFieldLockApplyQueryVO;
8 9 import com.order.erp.domain.vo.order.OrderFieldLockApplyVO;
... ... @@ -53,6 +54,7 @@ public interface OrderFieldLockApplyService extends IService&lt;OrderFieldLockApply
53 54 * @return
54 55 */
55 56 ServerResult doAudit(AuditVO auditVO);
  57 + ServerResult audit_detail(AuditDetailQueryVO auditDetailQueryVO);
56 58  
57 59 /**
58 60 * 修改数据
... ...
src/main/java/com/order/erp/service/order/impl/InvoiceBillOrderServiceImpl.java
... ... @@ -14,10 +14,7 @@ import com.order.erp.common.constant.Constant;
14 14 import com.order.erp.common.constant.ServerResult;
15 15 import com.order.erp.common.constant.ServerResultCode;
16 16 import com.order.erp.common.exception.BusinessException;
17   -import com.order.erp.common.utils.DateUtils;
18   -import com.order.erp.common.utils.EmailSendUtils;
19   -import com.order.erp.common.utils.StringUtils;
20   -import com.order.erp.common.utils.TransactionHelper;
  17 +import com.order.erp.common.utils.*;
21 18 import com.order.erp.config.DataScope;
22 19 import com.order.erp.domain.*;
23 20 import com.order.erp.domain.dto.BaseDO;
... ... @@ -31,6 +28,7 @@ import lombok.extern.slf4j.Slf4j;
31 28 import org.apache.poi.ss.usermodel.*;
32 29 import org.apache.poi.ss.util.CellRangeAddress;
33 30 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  31 +import org.joda.time.DateTime;
34 32 import org.springframework.beans.BeanUtils;
35 33 import org.springframework.stereotype.Service;
36 34  
... ... @@ -43,6 +41,7 @@ import java.net.URLDecoder;
43 41 import java.nio.charset.StandardCharsets;
44 42 import java.time.LocalDateTime;
45 43 import java.util.*;
  44 +import java.util.concurrent.TimeUnit;
46 45 import java.util.function.Function;
47 46 import java.util.stream.Collectors;
48 47 import java.util.stream.Stream;
... ... @@ -79,6 +78,8 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
79 78 private TransactionHelper transactionHelper;
80 79 @Resource
81 80 private EmailSendUtils emailSendUtils;
  81 + @Resource
  82 + private RedisUtils redisUtils;
82 83  
83 84  
84 85 /**
... ... @@ -124,17 +125,98 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
124 125 }
125 126 RoleEnum role = dataScope.getRole();
126 127 Page<FinanceOrderResultVO> page = new Page<>(queryVO.getPage(), queryVO.getPageSize());
  128 + //跟单员
127 129 if(Objects.nonNull(role) && role.getId().equals(RoleEnum.TRACKER_USER.getId())) {
128 130 queryVO.setTrackerUserName(dataScope.getLoginUserName());
129 131 IPage<FinanceOrderResultVO> financeOrderResultVOIPage = baseMapper.byConditionGetOrder(page, queryVO);
  132 + financeOrderResultVOIPage.getRecords().stream().peek(x -> {
  133 + String smallPicUrl="";
  134 + if(StringUtils.isNotEmpty(x.getSmallPicUrl())){
  135 + String smallPicUrlKey = Constant.OSS_SMALL_PIC_URL+x.getSmallPicUrl();
  136 + smallPicUrl= (String)redisUtils.get(smallPicUrlKey);
  137 + if(StringUtils.isBlank(smallPicUrl)){
  138 + smallPicUrl= AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(x.getSmallPicUrl())
  139 + ,SplitUrlGetBucketName.getFileName(x.getSmallPicUrl())
  140 + , new DateTime().plusHours(Constant.TWO).toDate());
  141 + redisUtils.set(smallPicUrlKey,smallPicUrl,Constant.ONEPOINTNINE_HOURS, TimeUnit.SECONDS);
  142 + }
  143 + }
  144 + x.setSmallPicUrl(smallPicUrl);
  145 +
  146 + if(StringUtils.isNotEmpty(x.getInvoiceBgUrl())){
  147 + String invoiceBgUrlKey = Constant.OSS_BG_URL + x.getInvoiceBgUrl();
  148 + String invoiceBgUrl = (String) redisUtils.get(invoiceBgUrlKey);
  149 + if(StringUtils.isBlank(invoiceBgUrl)){
  150 + invoiceBgUrl= AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(x.getInvoiceBgUrl())
  151 + ,SplitUrlGetBucketName.getFileName(x.getInvoiceBgUrl())
  152 + , new DateTime().plusHours(Constant.TWO).toDate());
  153 + redisUtils.set(invoiceBgUrlKey,invoiceBgUrl,Constant.ONEPOINTNINE_HOURS,TimeUnit.SECONDS);
  154 + }
  155 + x.setInvoiceBgUrl(invoiceBgUrl);
  156 + }
  157 + }).collect(Collectors.toList());
130 158 return ServerResult.success(financeOrderResultVOIPage);
131 159 }
  160 + //业务员
132 161 if (Objects.nonNull(role) && role.getId().equals(RoleEnum.BUSINESS_USER.getId())) {
133 162 queryVO.setBusinessUserName(dataScope.getLoginUserName());
134 163 IPage<FinanceOrderResultVO> financeOrderResultVOIPage = baseMapper.byConditionGetOrder(page,queryVO);
  164 + financeOrderResultVOIPage.getRecords().stream().peek(x -> {
  165 + String smallPicUrl="";
  166 + if(StringUtils.isNotEmpty(x.getSmallPicUrl())){
  167 + String smallPicUrlKey = Constant.OSS_SMALL_PIC_URL+x.getSmallPicUrl();
  168 + smallPicUrl= (String)redisUtils.get(smallPicUrlKey);
  169 + if(StringUtils.isBlank(smallPicUrl)){
  170 + smallPicUrl= AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(x.getSmallPicUrl())
  171 + ,SplitUrlGetBucketName.getFileName(x.getSmallPicUrl())
  172 + , new DateTime().plusHours(Constant.TWO).toDate());
  173 + redisUtils.set(smallPicUrlKey,smallPicUrl,Constant.ONEPOINTNINE_HOURS, TimeUnit.SECONDS);
  174 + }
  175 + }
  176 + x.setSmallPicUrl(smallPicUrl);
  177 +
  178 + if(StringUtils.isNotEmpty(x.getInvoiceBgUrl())){
  179 + String invoiceBgUrlKey = Constant.OSS_BG_URL + x.getInvoiceBgUrl();
  180 + String invoiceBgUrl = (String) redisUtils.get(invoiceBgUrlKey);
  181 + if(StringUtils.isBlank(invoiceBgUrl)){
  182 + invoiceBgUrl= AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(x.getInvoiceBgUrl())
  183 + ,SplitUrlGetBucketName.getFileName(x.getInvoiceBgUrl())
  184 + , new DateTime().plusHours(Constant.TWO).toDate());
  185 + redisUtils.set(invoiceBgUrlKey,invoiceBgUrl,Constant.ONEPOINTNINE_HOURS,TimeUnit.SECONDS);
  186 + }
  187 + x.setInvoiceBgUrl(invoiceBgUrl);
  188 + }
  189 + }).collect(Collectors.toList());
135 190 return ServerResult.success(financeOrderResultVOIPage);
136 191 }
  192 + //管理员和财务能够看到所有订单。
137 193 IPage<FinanceOrderResultVO> financeOrderResultVOIPage = baseMapper.byConditionGetOrder(page,queryVO);
  194 + financeOrderResultVOIPage.getRecords().stream().peek(x -> {
  195 + String smallPicUrl="";
  196 + if(StringUtils.isNotEmpty(x.getSmallPicUrl())){
  197 + String smallPicUrlKey = Constant.OSS_SMALL_PIC_URL+x.getSmallPicUrl();
  198 + smallPicUrl= (String)redisUtils.get(smallPicUrlKey);
  199 + if(StringUtils.isBlank(smallPicUrl)){
  200 + smallPicUrl= AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(x.getSmallPicUrl())
  201 + ,SplitUrlGetBucketName.getFileName(x.getSmallPicUrl())
  202 + , new DateTime().plusHours(Constant.TWO).toDate());
  203 + redisUtils.set(smallPicUrlKey,smallPicUrl,Constant.ONEPOINTNINE_HOURS, TimeUnit.SECONDS);
  204 + }
  205 + }
  206 + x.setSmallPicUrl(smallPicUrl);
  207 +
  208 + if(StringUtils.isNotEmpty(x.getInvoiceBgUrl())){
  209 + String invoiceBgUrlKey = Constant.OSS_BG_URL + x.getInvoiceBgUrl();
  210 + String invoiceBgUrl = (String) redisUtils.get(invoiceBgUrlKey);
  211 + if(StringUtils.isBlank(invoiceBgUrl)){
  212 + invoiceBgUrl= AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(x.getInvoiceBgUrl())
  213 + ,SplitUrlGetBucketName.getFileName(x.getInvoiceBgUrl())
  214 + , new DateTime().plusHours(Constant.TWO).toDate());
  215 + redisUtils.set(invoiceBgUrlKey,invoiceBgUrl,Constant.ONEPOINTNINE_HOURS,TimeUnit.SECONDS);
  216 + }
  217 + x.setInvoiceBgUrl(invoiceBgUrl);
  218 + }
  219 + }).collect(Collectors.toList());
138 220 return ServerResult.success(financeOrderResultVOIPage);
139 221 }
140 222 // }
... ... @@ -977,10 +1059,9 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
977 1059 return InvoiceBillOrderDO.builder()
978 1060 .invoiceNo(createVO.getInvoiceNo())
979 1061 .orderId(x.getId())
980   - .bgUrl(createVO.getBgUrl())
  1062 + .bgUrl(StringUtils.isNotEmpty(createVO.getBgUrl()) ?SplitUrlGetBucketName.getUrlFileName(createVO.getBgUrl()) : null)
981 1063 .backRefundDate(createVO.getBackRefundDate())
982 1064 .status(FinanceEnum.UNPAID_PAYMENTS.getStatus())
983   - .finishStatus(FinanceEnum.UNPAID_PAYMENTS.getStatus())
984 1065 .businesPerson(x.getBusinessPerson())
985 1066 .trackerUser(x.getCreateBy())
986 1067 .build();
... ... @@ -1057,6 +1138,7 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
1057 1138 */
1058 1139 @Override
1059 1140 public ServerResult updateDeductInfo(InvoiceBillDeductInfoVO deductInfoVO) {
  1141 + Long loginUserId = dataScope.getLoginUserId();
1060 1142 if (Objects.isNull(deductInfoVO.getId())) {
1061 1143 throw new BusinessException("id 不能为空");
1062 1144 }
... ... @@ -1064,14 +1146,62 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
1064 1146 if (Objects.isNull(invoiceBillOrderDo)) {
1065 1147 throw new BusinessException("应收款单据不存在");
1066 1148 }
1067   - if(Objects.nonNull(invoiceBillOrderDo.getStatus()) && FinanceEnum.RECEIVED_PAYMENT.getStatus()==invoiceBillOrderDo.getStatus()){
1068   - throw new BusinessException("应收款单据已收款,无法编辑");
  1149 + if(Objects.nonNull(invoiceBillOrderDo.getStatus()) && ((FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(invoiceBillOrderDo.getStatus())) ||
  1150 + (FinanceEnum.OK_PAYMENT.getStatus().equals(invoiceBillOrderDo.getStatus())))){
  1151 + throw new BusinessException("应收款单据已审核通过,无法编辑");
1069 1152 }
1070 1153 //todo 审核有问题 完成1
1071 1154 // checkCommitApply(invoiceBillOrderDo.getId());
1072 1155 checkApply(new ArrayList<>(Arrays.asList(deductInfoVO.getId())));
  1156 + //对扣款单进行审批。
  1157 + checkCommitDeductionUrlApply(invoiceBillOrderDo.getId());
  1158 + OrderLockFieldVO orderLockFieldVO = new OrderLockFieldVO();
  1159 + DeductionUrlFieldVO deductionUrlFieldVO=new DeductionUrlFieldVO();
  1160 + invoiceBillOrderDo.setDeductAmount((deductInfoVO.getDeductAmount()==null?BigDecimal.ZERO:deductInfoVO.getDeductAmount()).setScale(2, RoundingMode.HALF_UP));
  1161 + //客户总金额减去发生扣款金额。
  1162 + invoiceBillOrderDo.setActualReceivableAmount((invoiceBillOrderDo.getTotalCustomerAmount().subtract(deductInfoVO.getDeductAmount()==null?BigDecimal.ZERO:deductInfoVO.getDeductAmount())).setScale(2, RoundingMode.HALF_UP));
  1163 + if(StringUtils.isNotBlank(deductInfoVO.getDeductUrl())){
  1164 + invoiceBillOrderDo.setInvoiceDeductUrlStatus(ApplyStatusEnum.WAIT_AUDIT.getStatus());
  1165 + }
  1166 + updateById(invoiceBillOrderDo);
  1167 + if(StringUtils.isNotBlank(deductInfoVO.getDeductUrl())){
  1168 + OrderBaseInfoDO orderBaseInfoDO = orderBaseInfoService.getById(invoiceBillOrderDo.getOrderId());
  1169 + //以后对于文件类型,只存文件名,通过bucket每次实时访问。以前是设置过期时间很长,永久存在数据库中。
  1170 + String urlFileName = SplitUrlGetBucketName.getUrlFileName(deductInfoVO.getDeductUrl());
  1171 + //不保存,仅仅只是做一个审核,千万不要保存。目的是传递给审核的最新的扣款单,审核通过后才保存,不通过则不保存。
  1172 + invoiceBillOrderDo.setDeductUrl(urlFileName);
  1173 + deductionUrlFieldVO.setInvoiceNo(invoiceBillOrderDo.getInvoiceNo());
  1174 + if(Objects.nonNull(orderBaseInfoDO)){
  1175 + deductionUrlFieldVO.setInnerNo(orderBaseInfoDO.getInnerNo());
  1176 + }
  1177 + deductionUrlFieldVO.setId(invoiceBillOrderDo.getId());
  1178 + deductionUrlFieldVO.setBusinesPerson(invoiceBillOrderDo.getBusinesPerson());
  1179 + deductionUrlFieldVO.setFinancePerson(invoiceBillOrderDo.getFinancePerson());
  1180 + deductionUrlFieldVO.setTrackerUser(invoiceBillOrderDo.getTrackerUser());
  1181 + deductionUrlFieldVO.setDeductUrl(urlFileName);
  1182 + deductionUrlFieldVO.setDeductAmount(deductInfoVO.getDeductAmount());
  1183 + orderLockFieldVO.setDeductionUrlFieldVO(deductionUrlFieldVO);
  1184 + OrderFieldLockApplyDO applyDO = OrderFieldLockApplyDO.builder()
  1185 + .applyUserId(loginUserId)
  1186 + .auditUserId(null)
  1187 + .fields(JSONObject.toJSONString(orderLockFieldVO))
  1188 + .orderId(invoiceBillOrderDo.getId())
  1189 + .type(ApplyTypeEnum.INVOICE_DEDUCT_URL.getType())
  1190 + .remark(ApplyTypeEnum.INVOICE_DEDUCT_URL.getDesc())
  1191 + .status(ApplyStatusEnum.WAIT_AUDIT.getStatus())
  1192 + .auditRoleCodes(RoleEnum.ADMIN.getCode() + Constant.COMMA_CHARACTER + RoleEnum.FINANCE_USER.getCode())
  1193 + .build();
  1194 + orderFieldLockApplyService.save(applyDO);
  1195 + }
  1196 + return ServerResult.success();
  1197 +
  1198 +
  1199 +
1073 1200  
1074   - if(StringUtils.isNotBlank(invoiceBillOrderDo.getDeductUrl())){
  1201 +
  1202 +
  1203 +
  1204 + /* if(StringUtils.isNotBlank(invoiceBillOrderDo.getDeductUrl())){
1075 1205 //记住:需要修改数据表对应的字段deduct_url的varchar数据范围,修改为1000左右。
1076 1206 if(StringUtils.isNotBlank(deductInfoVO.getDeductUrl())){
1077 1207 Set<String> deductUrlSet = new HashSet<>(Arrays.asList(
... ... @@ -1092,7 +1222,7 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
1092 1222 //客户总金额减去发生扣款金额。
1093 1223 invoiceBillOrderDo.setActualReceivableAmount((invoiceBillOrderDo.getTotalCustomerAmount().subtract(deductInfoVO.getDeductAmount()==null?BigDecimal.ZERO:deductInfoVO.getDeductAmount())).setScale(2, RoundingMode.HALF_UP));
1094 1224 updateById(invoiceBillOrderDo);
1095   - return ServerResult.success();
  1225 + return ServerResult.success();*/
1096 1226 }
1097 1227  
1098 1228 @Override
... ... @@ -1106,8 +1236,9 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
1106 1236 }
1107 1237 //todo 审核有问题 完成2
1108 1238 // checkCommitApply(invoiceBillOrderDo.getId());
1109   - if(Objects.nonNull(invoiceBillOrderDo.getStatus()) && FinanceEnum.RECEIVED_PAYMENT.getStatus()==invoiceBillOrderDo.getStatus()){
1110   - throw new BusinessException("已完成收款,无法更新!");
  1239 + if(Objects.nonNull(invoiceBillOrderDo.getStatus()) && ((FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(invoiceBillOrderDo.getStatus())) ||
  1240 + (FinanceEnum.OK_PAYMENT.getStatus().equals(invoiceBillOrderDo.getStatus())))){
  1241 + throw new BusinessException("应收款单据已审核通过,无法编辑");
1111 1242 }
1112 1243 checkApply(new ArrayList<>(Arrays.asList(amountInfoVO.getId())));
1113 1244  
... ... @@ -1153,7 +1284,8 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
1153 1284 throw new BusinessException("勾选订单的invoice需一致");
1154 1285 }
1155 1286 //判断选择订单中是否包含已审核通过的订单。 todo:这里需要在审核处理之后,给orderid设置状态,给外带的finacneId集合也设置状态,这里才能生效。
1156   - boolean isTrue = invoiceBillOrderDOS.stream().filter(Objects::nonNull).anyMatch(invoiceBillOrder -> FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(invoiceBillOrder.getStatus()));
  1287 + boolean isTrue = invoiceBillOrderDOS.stream().filter(Objects::nonNull).anyMatch(invoiceBillOrder -> ((FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(invoiceBillOrder.getStatus())))
  1288 + || (FinanceEnum.OK_PAYMENT.getStatus().equals(invoiceBillOrder.getStatus())));
1157 1289 if(isTrue){
1158 1290 throw new BusinessException("订单中包含已收款的数据,无法提交!");
1159 1291 }
... ... @@ -1250,6 +1382,22 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
1250 1382 }
1251 1383 }
1252 1384  
  1385 +
  1386 + /**
  1387 + * @param id
  1388 + *
  1389 + */
  1390 + private void checkCommitDeductionUrlApply(Long id){
  1391 + List<OrderFieldLockApplyDO> orderFieldLockApplyDOList = orderFieldLockApplyService.list(new LambdaQueryWrapper<OrderFieldLockApplyDO>()
  1392 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  1393 + .eq(OrderFieldLockApplyDO::getType, ApplyTypeEnum.INVOICE_DEDUCT_URL.getType())
  1394 + .eq(OrderFieldLockApplyDO::getStatus, ApplyStatusEnum.WAIT_AUDIT.getStatus())
  1395 + .eq(OrderFieldLockApplyDO::getOrderId, id));
  1396 + if(CollectionUtils.isNotEmpty(orderFieldLockApplyDOList)){
  1397 + throw new BusinessException("存在未审核的扣款单,请联系财务审批上一张扣款单后再上传");
  1398 + }
  1399 + }
  1400 +
1253 1401 /**
1254 1402 * @param ids
1255 1403 * @param userId
... ... @@ -1334,7 +1482,8 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
1334 1482  
1335 1483 //有一个审核通过不能删除。之所以这样做,是因为避免忘记其他订单创建invoice,然后遗落了,所以需要删掉重新创建,避免每一个都提交审核并且审核后通过了了。
1336 1484 boolean anyPaid = invoiceBillOrderList.stream().filter(Objects::nonNull)
1337   - .anyMatch(invoiceBillOrderDO -> FinanceEnum.RECEIVED_PAYMENT.getStatus()== invoiceBillOrderDO.getStatus());
  1485 + .anyMatch(invoiceBillOrderDO -> (FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(invoiceBillOrderDO.getStatus()))
  1486 + || (FinanceEnum.OK_PAYMENT.getStatus().equals( invoiceBillOrderDO.getStatus())));
1338 1487 if (anyPaid) {
1339 1488 throw new BusinessException("包含已收款的订单,无法删除!");
1340 1489 }
... ... @@ -1373,12 +1522,15 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
1373 1522 }
1374 1523 Map<String, String> hashMap = new HashMap<>();
1375 1524 //获取每一个url的文件名称
  1525 + // https://alterego.oss-cn-qingdao.aliyuncs.com/
  1526 + // Thumbnails-1735377429935-4024%E5%9B%BE%E7%89%871.png?Expires=1741938071&OSSAccessKeyId=LTAI5tHKVvrz1xxExYD7E3mo&Signature=rBFguaDI5fEl3Yk%2FjbXburRZ0ok%3D
1376 1527 Arrays.stream( InvoiceBillOrderDO.getDeductUrl().split(",")).forEach(x->{
1377 1528 try{
1378   - String preUrl = x.split("\\?")[0];
1379   - String fileName = preUrl.substring(preUrl.lastIndexOf("/") + 1);
  1529 +// String preUrl = x.split("\\?")[0];
  1530 + String fileName = x.substring(x.lastIndexOf("/") + 1);
1380 1531 String decodUrle = URLDecoder.decode(fileName, StandardCharsets.UTF_8.name());
1381   - hashMap.put(decodUrle,x);
  1532 + String url = AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(x), decodUrle, new DateTime().plusMinutes(Constant.TWO).toDate());
  1533 + hashMap.put(decodUrle,url);
1382 1534 }catch (Exception e){
1383 1535 throw new BusinessException("文件名错误!");
1384 1536 }
... ... @@ -1404,7 +1556,7 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
1404 1556 .eq(InvoiceBillOrderDO::getInvoiceNo, invoiceBillOrderDO.getInvoiceNo()));
1405 1557 List<InvoiceBillOrderDO> invoiceBillOrderDOList= invoiceBillOrderDOS.stream().map(invoiceBillOrder -> {
1406 1558 //重新上传报关单
1407   - invoiceBillOrder.setBgUrl(bgUrl.getBgUrl());
  1559 + invoiceBillOrder.setBgUrl(SplitUrlGetBucketName.getUrlFileName(bgUrl.getBgUrl()));
1408 1560 return invoiceBillOrder;
1409 1561 }).collect(Collectors.toList());
1410 1562 updateBatchById(invoiceBillOrderDOList);
... ... @@ -1496,9 +1648,10 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
1496 1648 }
1497 1649 List<InvoiceBillOrderDO> invoiceBillOrderDOList = list(new LambdaQueryWrapper<InvoiceBillOrderDO>().eq(InvoiceBillOrderDO::getEnableFlag, Constant.ENABLE_TEN)
1498 1650 .eq(InvoiceBillOrderDO::getInvoiceNo, invoiceBillOrderDO.getInvoiceNo()));
1499   - boolean anyPaid= invoiceBillOrderDOList.stream().filter(Objects::nonNull).anyMatch(invoiceBillOrder -> FinanceEnum.RECEIVED_PAYMENT.getStatus() == invoiceBillOrder.getStatus());
  1651 + boolean anyPaid= invoiceBillOrderDOList.stream().filter(Objects::nonNull).anyMatch(invoiceBillOrder -> (FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(invoiceBillOrder.getStatus()))
  1652 + ||(FinanceEnum.OK_PAYMENT.getStatus().equals(invoiceBillOrder.getStatus())) );
1500 1653 if(anyPaid){
1501   - throw new BusinessException("相同invoiceNo的订单已收款完成,无法设置!");
  1654 + throw new BusinessException("相同invoiceNo的订单已审核通过,无法设置!");
1502 1655 }
1503 1656 //todo 要审核判断一下,是否处于审核状态。 完成4
1504 1657 checkApply(invoiceBillOrderDOList.stream().filter(Objects::nonNull).map(invoiceDO -> invoiceDO.getId()).collect(Collectors.toList()));
... ... @@ -1535,8 +1688,9 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
1535 1688 throw new BusinessException("应收款单不存在!");
1536 1689 }
1537 1690 checkApply( new ArrayList<>(Arrays.asList(deleteVo.getId())));
1538   - if(Objects.nonNull(invoiceBillOrderDO.getStatus()) && FinanceEnum.RECEIVED_PAYMENT.getStatus()==invoiceBillOrderDO.getStatus()){
1539   - throw new BusinessException("已完成收款,无法删除!");
  1691 + if(Objects.nonNull(invoiceBillOrderDO.getStatus()) && (FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(invoiceBillOrderDO.getStatus())
  1692 + || FinanceEnum.OK_PAYMENT.getStatus().equals(invoiceBillOrderDO.getStatus()))){
  1693 + throw new BusinessException("该订单已审核通过,无法删除!");
1540 1694 }
1541 1695 invoiceBillOrderDO.setDeductUrl("");
1542 1696 updateById(invoiceBillOrderDO);
... ... @@ -1545,20 +1699,34 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl&lt;InvoiceBillOrderMap
1545 1699  
1546 1700 @Override
1547 1701 public ServerResult isFinishStatus(InvoiceBillDeductInfoVO invoiceBillDeductInfoVO) {
  1702 + if(Objects.isNull(invoiceBillDeductInfoVO.getId())){
  1703 + throw new BusinessException(ServerResultCode.PARAM_ERROR);
  1704 + }
1548 1705 InvoiceBillOrderDO invoiceBillOrderDO = getById(invoiceBillDeductInfoVO.getId());
1549 1706 if(Objects.nonNull(invoiceBillOrderDO)){
1550   - if(!FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(invoiceBillOrderDO.getStatus())){
1551   - throw new BusinessException("该订单还没有完成最终收款,你无法设置最终状态为已完成!");
  1707 + if((!FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(invoiceBillOrderDO.getStatus())) && (!FinanceEnum.OK_PAYMENT.getStatus().equals(invoiceBillOrderDO.getStatus()))){
  1708 + throw new BusinessException("该订单还没有审核通过,你无法设置最终状态为已收款!");
1552 1709 }
1553 1710 List<InvoiceBillOrderDO> invoiceBillOrderDOList = list(new LambdaQueryWrapper<InvoiceBillOrderDO>().eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
1554 1711 .eq(InvoiceBillOrderDO::getInvoiceNo, invoiceBillOrderDO.getInvoiceNo())
1555 1712 .eq(InvoiceBillOrderDO::getStatus, FinanceEnum.RECEIVED_PAYMENT.getStatus()));
1556 1713 if(CollectionUtils.isNotEmpty(invoiceBillOrderDOList)){
1557 1714 List<InvoiceBillOrderDO> finishSatusList = invoiceBillOrderDOList.stream().map(x -> {
1558   - x.setFinishStatus(FinanceEnum.RECEIVED_PAYMENT.getStatus());
  1715 + x.setStatus(FinanceEnum.OK_PAYMENT.getStatus());
1559 1716 return x;
1560 1717 }).collect(Collectors.toList());
1561   - updateBatchById(finishSatusList);
  1718 + //还需要把基础订单的状态也改一下。
  1719 + List<Long> orderIds = invoiceBillOrderDOList.stream().map(InvoiceBillOrderDO::getOrderId).collect(Collectors.toList());
  1720 + List<OrderBaseInfoDO> orderBaseInfoDOList = orderBaseInfoService.listByIds(orderIds);
  1721 + List<OrderBaseInfoDO> orderBaseInfoDOS = orderBaseInfoDOList.stream().map(order -> {
  1722 + order.setInvoiceStatus(FinanceEnum.OK_PAYMENT.getStatus());
  1723 + return order;
  1724 + }).collect(Collectors.toList());
  1725 + transactionHelper.run(() ->{
  1726 + updateBatchById(finishSatusList);
  1727 + orderBaseInfoService.updateBatchById(orderBaseInfoDOS);
  1728 + });
  1729 +
1562 1730 }
1563 1731 }
1564 1732 return ServerResult.success();
... ...
src/main/java/com/order/erp/service/order/impl/OrderBaseInfoServiceImpl.java
... ... @@ -22,6 +22,7 @@ import com.order.erp.common.constant.ServerResultCode;
22 22 import com.order.erp.common.excel4j.exceptions.Excel4JException;
23 23 import com.order.erp.common.exception.BusinessException;
24 24 import com.order.erp.common.utils.*;
  25 +import com.order.erp.config.AliOssConfig;
25 26 import com.order.erp.config.DataScope;
26 27 import com.order.erp.config.MapResultHandler;
27 28 import com.order.erp.domain.*;
... ... @@ -30,6 +31,8 @@ import com.order.erp.domain.dto.SystemSettingDO;
30 31 import com.order.erp.domain.dto.admin.AdminUserDO;
31 32 import com.order.erp.domain.dto.admin.AdminUserRoleDO;
32 33 import com.order.erp.domain.dto.order.*;
  34 +import com.order.erp.domain.excel.AccountStatementExcelVO;
  35 +import com.order.erp.domain.vo.AccountStatementVO;
33 36 import com.order.erp.domain.vo.ProducePdfVO;
34 37 import com.order.erp.domain.vo.order.*;
35 38 import com.order.erp.job.OrderOverTimeEventJob;
... ... @@ -49,11 +52,10 @@ import org.springframework.transaction.annotation.Transactional;
49 52 import javax.annotation.Resource;
50 53 import javax.mail.MessagingException;
51 54 import javax.servlet.http.HttpServletResponse;
52   -import java.io.File;
53   -import java.io.IOException;
54   -import java.io.InputStream;
  55 +import java.io.*;
55 56 import java.math.BigDecimal;
56 57 import java.math.RoundingMode;
  58 +import java.net.MalformedURLException;
57 59 import java.net.URL;
58 60 import java.text.DecimalFormat;
59 61 import java.time.LocalDate;
... ... @@ -151,6 +153,8 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl&lt;OrderBaseInfoMapper, O
151 153  
152 154 @Resource
153 155 private OrderTrackStageService orderTrackStageService;
  156 + @Resource
  157 + private AccountStatementExcel accountStatementExcel;
154 158  
155 159  
156 160  
... ... @@ -218,6 +222,32 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl&lt;OrderBaseInfoMapper, O
218 222 List<OrderInfoResultVO> resultVOList = new ArrayList<>();
219 223 if (CollectionUtils.isNotEmpty(orderBaseInfoDOList)) {
220 224 resultVOList = orderBaseInfoDOList.stream().map(x -> {
  225 + String picUrl = "";
  226 + if(com.order.erp.common.utils.StringUtils.isNotEmpty(x.getPicUrl())){
  227 + String picUrlKey=Constant.OSS_PIC_URL+x.getPicUrl();
  228 + picUrl= (String) redisUtils.get(picUrlKey);
  229 + if(StringUtils.isBlank(picUrl)){
  230 + picUrl = AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(x.getPicUrl())
  231 + ,SplitUrlGetBucketName.getFileName(x.getPicUrl())
  232 + , new DateTime().plusHours(Constant.TWO).toDate());
  233 + //设置redis过期时间为1.9小时。 oss的实时链接为2小时。
  234 + redisUtils.set(picUrlKey,picUrl, Constant.ONEPOINTNINE_HOURS, TimeUnit.SECONDS);
  235 + }
  236 + }
  237 + x.setPicUrl(picUrl);
  238 + String smallPicUrl = "";
  239 + if(com.order.erp.common.utils.StringUtils.isNotEmpty(x.getSmallPicUrl())){
  240 + String smallPicUrlKey=Constant.OSS_SMALL_PIC_URL+x.getSmallPicUrl();
  241 + smallPicUrl= (String) redisUtils.get(smallPicUrlKey);
  242 + if(StringUtils.isBlank(smallPicUrl)){
  243 + smallPicUrl = AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(x.getSmallPicUrl())
  244 + , SplitUrlGetBucketName.getFileName(x.getSmallPicUrl()),
  245 + new DateTime().plusHours(Constant.TWO).toDate());
  246 + //设置redis过期时间为1.9小时。 oss的实时链接为2小时。
  247 + redisUtils.set(smallPicUrlKey,smallPicUrl, Constant.ONEPOINTNINE_HOURS, TimeUnit.SECONDS);
  248 + }
  249 + }
  250 + x.setSmallPicUrl(smallPicUrl);
221 251 OrderInfoResultVO resultVO = new OrderInfoResultVO();
222 252 BeanUtils.copyProperties(x, resultVO);
223 253 return resultVO;
... ... @@ -279,6 +309,27 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl&lt;OrderBaseInfoMapper, O
279 309 String productionComment = productionCommentS[productionCommentS.length - 1];
280 310 x.setProductionComment(productionComment);
281 311 }
  312 + String picUrl="";
  313 + if(com.order.erp.common.utils.StringUtils.isNotEmpty(x.getPicUrl())){
  314 + String picUrlKey = Constant.OSS_PIC_URL + x.getPicUrl();
  315 + picUrl =(String)redisUtils.get(picUrlKey);
  316 + if(StringUtils.isBlank(picUrl)){
  317 + picUrl= AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(x.getPicUrl()),SplitUrlGetBucketName.getFileName(x.getPicUrl()),new DateTime().plusHours(Constant.TWO).toDate());
  318 + redisUtils.set(picUrlKey,picUrl,Constant.ONEPOINTNINE_HOURS,TimeUnit.SECONDS);
  319 + }
  320 + }
  321 + x.setPicUrl(picUrl);
  322 + String smallPicUrl="";
  323 + if(com.order.erp.common.utils.StringUtils.isNotEmpty(x.getSmallPicUrl())){
  324 + String smallPicUrlKey=Constant.OSS_SMALL_PIC_URL+x.getSmallPicUrl();
  325 + smallPicUrl=(String)redisUtils.get(smallPicUrlKey);
  326 + if(StringUtils.isBlank(smallPicUrl)){
  327 + smallPicUrl= AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(x.getSmallPicUrl()),SplitUrlGetBucketName.getFileName(x.getSmallPicUrl()),new DateTime().plusHours(Constant.TWO).toDate());
  328 + redisUtils.set(smallPicUrlKey,smallPicUrl,Constant.ONEPOINTNINE_HOURS,TimeUnit.SECONDS);
  329 + }
  330 +
  331 + }
  332 + x.setSmallPicUrl(smallPicUrl);
282 333 OrderInfoResultVO resultVO = new OrderInfoResultVO();
283 334 BeanUtils.copyProperties(x, resultVO);
284 335 return resultVO;
... ... @@ -1566,10 +1617,13 @@ end
1566 1617 }
1567 1618 Long userId = dataScope.getLoginUserId();
1568 1619 OrderBaseInfoDO baseInfoDO = new OrderBaseInfoDO();
1569   - BeanUtils.copyProperties(baseInfoVO, baseInfoDO);
  1620 + BeanUtils.copyProperties(baseInfoVO, baseInfoDO,"picUrl","smallPicUrl");
1570 1621 baseInfoDO.setOrderStatus(OrderStatusEnum.CREATE_FINISH.getStatus());
1571 1622 baseInfoDO.setCheckStatus(FinanceEnum.NOT_CREATED.getStatus());
1572 1623 baseInfoDO.setInvoiceStatus(FinanceEnum.NOT_CREATED.getStatus());
  1624 + //存储时不再存储过期时间为十年的url,而是存储文件名称,到时候访问图片资源时,携带bucket,访问重新生成的携带accesskey的url。
  1625 + baseInfoDO.setPicUrl(SplitUrlGetBucketName.getUrlFileName(baseInfoVO.getPicUrl()));
  1626 + baseInfoDO.setSmallPicUrl(SplitUrlGetBucketName.getUrlFileName(baseInfoVO.getSmallPicUrl()));
1573 1627 save(baseInfoDO);
1574 1628  
1575 1629 OrderOpinionLogDO orderOpinionLogDO = buildOrderOpinionLogDo(baseInfoDO.getId(),
... ... @@ -2318,10 +2372,10 @@ end
2318 2372 baseInfoDO.setCnColor(baseInfoVO.getCnColor());
2319 2373 }
2320 2374 if (StringUtils.isNotBlank(baseInfoVO.getPicUrl())) {
2321   - baseInfoDO.setPicUrl(baseInfoVO.getPicUrl());
  2375 + baseInfoDO.setPicUrl(SplitUrlGetBucketName.getUrlFileName(baseInfoVO.getPicUrl()));
2322 2376 }
2323 2377 if (StringUtils.isNotBlank(baseInfoVO.getSmallPicUrl())) {
2324   - baseInfoDO.setSmallPicUrl(baseInfoVO.getSmallPicUrl());
  2378 + baseInfoDO.setSmallPicUrl(SplitUrlGetBucketName.getUrlFileName(baseInfoVO.getSmallPicUrl()));
2325 2379 }
2326 2380 if (StringUtils.isNotBlank(baseInfoVO.getProductionComment())) {
2327 2381 baseInfoDO.setProductionComment(baseInfoVO.getProductionComment());
... ... @@ -2680,7 +2734,17 @@ end
2680 2734 //邮箱收集完毕。
2681 2735 OrderEventJobVO orderEventJobVO = new OrderEventJobVO();
2682 2736 orderEventJobVO.setInspectionStageInfo(updateVO.getInspectionStageInfo());
2683   - OrderBaseInfoVO orderBaseInfoVo = BeanUtil.copyProperties(orderBaseInfoDO, OrderBaseInfoVO.class);
  2737 + OrderBaseInfoVO orderBaseInfoVo = BeanUtil.copyProperties(orderBaseInfoDO, OrderBaseInfoVO.class,"smallPicUrl");
  2738 + String smallPicUrl="";
  2739 + if(com.order.erp.common.utils.StringUtils.isNotEmpty(orderBaseInfoDO.getSmallPicUrl())){
  2740 + String smallPicUrlKey=Constant.OSS_SMALL_PIC_URL+orderBaseInfoDO.getSmallPicUrl();
  2741 + smallPicUrl=(String)redisUtils.get(smallPicUrlKey);
  2742 + if(StringUtils.isBlank(smallPicUrl)){
  2743 + smallPicUrl= AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(orderBaseInfoDO.getSmallPicUrl()), SplitUrlGetBucketName.getFileName(orderBaseInfoDO.getSmallPicUrl()), new DateTime().plusHours(Constant.TWO).toDate());
  2744 + redisUtils.set(smallPicUrlKey,smallPicUrl,Constant.ONEPOINTNINE_HOURS,TimeUnit.SECONDS);
  2745 + }
  2746 + }
  2747 + orderBaseInfoVo.setSmallPicUrl(smallPicUrl);
2684 2748 orderEventJobVO.setBaseInfo(orderBaseInfoVo);
2685 2749  
2686 2750 //一旦修改完质检信息就自动发送邮件对应的生产科。多次编辑保存多次发送。 只有当这次的尾期结果与上一次不一样才不会发送。
... ... @@ -2723,7 +2787,17 @@ end
2723 2787 List<String> allEmails=new ArrayList<>(emailsSet);
2724 2788 OrderEventJobVO orderEventJobVO = new OrderEventJobVO();
2725 2789 orderEventJobVO.setInspectionStageInfo(inspectionStageVO);
2726   - OrderBaseInfoVO orderBaseInfoVo = BeanUtil.copyProperties(orderBaseInfoDO, OrderBaseInfoVO.class);
  2790 + OrderBaseInfoVO orderBaseInfoVo = BeanUtil.copyProperties(orderBaseInfoDO, OrderBaseInfoVO.class,"smallPicUrl");
  2791 + String smallPicUrl="";
  2792 + if(com.order.erp.common.utils.StringUtils.isNotEmpty(orderBaseInfoDO.getSmallPicUrl())){
  2793 + String smallPicUrlKey=Constant.OSS_SMALL_PIC_URL+orderBaseInfoDO.getSmallPicUrl();
  2794 + smallPicUrl=(String)redisUtils.get(smallPicUrlKey);
  2795 + if(StringUtils.isBlank(smallPicUrl)){
  2796 + smallPicUrl= AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(orderBaseInfoDO.getSmallPicUrl()),SplitUrlGetBucketName.getFileName(orderBaseInfoDO.getSmallPicUrl()),new DateTime().plusHours(Constant.TWO).toDate());
  2797 + redisUtils.set(smallPicUrlKey,smallPicUrl,Constant.ONEPOINTNINE_HOURS,TimeUnit.SECONDS);
  2798 + }
  2799 + }
  2800 + orderBaseInfoVo.setSmallPicUrl(smallPicUrl);
2727 2801 orderEventJobVO.setBaseInfo(orderBaseInfoVo);
2728 2802 emailSendUtils.sendCheckResultEmail(EmailTemplateEnum.END_CHECK_REPORT_TEMPLATE, allEmails, orderEventJobVO);
2729 2803 }else{
... ... @@ -2811,7 +2885,16 @@ end
2811 2885 orderEventJobVO.getBaseInfo().setCustomerPo(orderBaseInfoDo.getCustomerPo());
2812 2886 orderEventJobVO.getBaseInfo().setCustomerStyle(orderBaseInfoDo.getCustomerStyle());
2813 2887 orderEventJobVO.getBaseInfo().setPoColor(orderBaseInfoDo.getPoColor());
2814   - orderEventJobVO.getBaseInfo().setSmallPicUrl(orderBaseInfoDo.getSmallPicUrl());
  2888 + String smallPicUrl="";
  2889 + if(com.order.erp.common.utils.StringUtils.isNotEmpty(orderBaseInfoDo.getSmallPicUrl())){
  2890 + String smallPicUrlKey=Constant.OSS_SMALL_PIC_URL+orderBaseInfoDo.getSmallPicUrl();
  2891 + smallPicUrl=(String)redisUtils.get(smallPicUrlKey);
  2892 + if(StringUtils.isBlank(smallPicUrl)){
  2893 + smallPicUrl= AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(orderBaseInfoDo.getSmallPicUrl()),SplitUrlGetBucketName.getFileName(orderBaseInfoDo.getSmallPicUrl()),new DateTime().plusHours(Constant.TWO).toDate());
  2894 + redisUtils.set(smallPicUrlKey,smallPicUrl,Constant.ONEPOINTNINE_HOURS,TimeUnit.SECONDS);
  2895 + }
  2896 + }
  2897 + orderEventJobVO.getBaseInfo().setSmallPicUrl(smallPicUrl);
2815 2898 orderEventJobVO.getBaseInfo().setOrderCount(orderBaseInfoDo.getOrderCount());
2816 2899 // String[] split = productionComment.split("\n");
2817 2900 // String[] split1 = split[split.length - 1].split("[::]+");
... ... @@ -2844,25 +2927,32 @@ end
2844 2927 if (TimePeriod.YEAR.getDescription().equals(dateTimeVO.getPeriod())) {
2845 2928 //查询每一年份的已完成订单数据。
2846 2929 //查询所有年份的完成订单数据。
2847   - long allYearCount = this.baseMapper.countAllYearByOrderStatus(OrderStatusEnum.ORDER_FINISH.getStatus());
2848   - //查询所有年份的跟单和质检中的数据。
  2930 + long allYearCountNoReturn = this.baseMapper.countAllYearByOrderStatus(OrderStatusEnum.ORDER_FINISH.getStatus());
  2931 + long allYearCountReturn = this.count(new LambdaQueryWrapper<OrderBaseInfoDO>().eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN).eq(OrderBaseInfoDO::getReturnOrder, Constant.STRING_ONE).eq(OrderBaseInfoDO::getOrderStatus,OrderStatusEnum.ORDER_FINISH.getStatus()));
  2932 + /* 查询所有年份的跟单和质检中的数据。
2849 2933 long tracking = orderTrackStageService.countRecentYearByOrderStatus(OrderStatusEnum.TRACK_ING.getStatus());
  2934 +
2850 2935 long inspecting = orderInspectionStageService.countRecentYearByOrderStatus(OrderStatusEnum.INSPECT_ING.getStatus());
  2936 + */
  2937 +
2851 2938 //查询所有年份的利润分析表的数据。(从orderFieldLockApplyDo表中查询。)。
2852 2939 // long rofit =this.baseMapper.countAllYearByOrderStatus(OrderStatusEnum.PROFIT_WAIT_AUDIT.getStatus());
2853 2940 long rofit = orderFieldLockApplyService.countAllYearByOrderStatus(ApplyTypeEnum.ORDER_PROFIT_APPLY.getType());
2854 2941 //查询所有年份的项目报告书待审核的数据。
2855   -// long report=this.baseMapper.countAllYearByOrderStatus(OrderStatusEnum.REPORT_WAIT_AUDIT.getStatus());
  2942 +// long report=this.baseMapper.count AllYearByOrderStatus(OrderStatusEnum.REPORT_WAIT_AUDIT.getStatus());
2856 2943 long report = orderFieldLockApplyService.countAllYearByOrderStatus(ApplyTypeEnum.ORDER_REPORT_APPLY.getType());
  2944 +
2857 2945 //查询所有年份的订单初始化的数据。
2858 2946 long orderInit = this.baseMapper.countRecentYearByOrderInit();
2859 2947  
  2948 + long returnOrderBaseInfoNumber = this.count(new LambdaQueryWrapper<OrderBaseInfoDO>().eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN).eq(OrderBaseInfoDO::getReturnOrder, Constant.STRING_ONE));
2860 2949 Datecount datecount = new Datecount();
2861   - datecount.setAllCount(allYearCount);
2862   - datecount.setTrackingAndInspectingList(tracking+inspecting);
  2950 + datecount.setAllCount(allYearCountNoReturn+allYearCountReturn);
  2951 + datecount.setTrackingAndInspectingList(orderInit+returnOrderBaseInfoNumber-allYearCountNoReturn-allYearCountReturn);
2863 2952 datecount.setProfitList(rofit);
2864 2953 datecount.setReportList(report);
2865   - datecount.setOrderInitList(orderInit);
  2954 + //订单初始化的数量计算方式是:对于不是返单的数据,相同的项目号和内部编号只能算一个订单,对于返单来说,就不进行去重。
  2955 + datecount.setOrderInitList(orderInit+returnOrderBaseInfoNumber);
2866 2956 return ServerResult.success(datecount);
2867 2957 }
2868 2958 //月
... ... @@ -2872,19 +2962,32 @@ end
2872 2962 LocalDate endOfYear = startOfYear.plusYears(1);
2873 2963 //如果为月,则需要前端传递year,然后得到这个year的数据。
2874 2964 //查询这个年每一个月的数据
2875   - long allMonthCount=this.baseMapper.countAllMonthByOrderStatus(OrderStatusEnum.ORDER_FINISH.getStatus(),startOfYear,endOfYear);
2876   - long tracking = orderTrackStageService.countRecentMonthValueByOrderStatus(OrderStatusEnum.TRACK_ING.getStatus(),startOfYear,endOfYear);
  2965 + long allMonthCountNoReturn=this.baseMapper.countAllMonthByOrderStatus(OrderStatusEnum.ORDER_FINISH.getStatus(),(long) (dateTime % 100));
  2966 + long allMonthCountReturn = this.count(new LambdaQueryWrapper<OrderBaseInfoDO>()
  2967 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  2968 + .eq(OrderBaseInfoDO::getReturnOrder, Constant.STRING_ONE)
  2969 + .eq(OrderBaseInfoDO::getOrderStatus,OrderStatusEnum.ORDER_FINISH.getStatus())
  2970 + .likeRight(OrderBaseInfoDO::getInnerNo, "_____" + dateTime % 100));
  2971 + /* long tracking = orderTrackStageService.countRecentMonthValueByOrderStatus(OrderStatusEnum.TRACK_ING.getStatus(),startOfYear,endOfYear);
  2972 + System.out.println("跟单中:"+tracking);
2877 2973 long inspecting = orderInspectionStageService.countRecentMonthValueByOrderStatus(OrderStatusEnum.INSPECT_ING.getStatus(),startOfYear,endOfYear);
  2974 + System.out.println("质检中:"+inspecting);*/
2878 2975 long profit = orderFieldLockApplyService.countRecentMonthValueByOrderStatus(ApplyTypeEnum.ORDER_PROFIT_APPLY.getType(),startOfYear,endOfYear);
2879 2976 long report = orderFieldLockApplyService.countRecentMonthValueByOrderStatus(ApplyTypeEnum.ORDER_REPORT_APPLY.getType(),startOfYear,endOfYear);
2880   - //查询年月的项目报告书待审核/订单初始化。
2881   - long orderinit=this.baseMapper.countRecentMonthValueByOrderInit(startOfYear,endOfYear);
  2977 +
  2978 + long orderInit=this.baseMapper.countRecentMonthValueByOrderInit((long) (dateTime % 100));
  2979 +
  2980 + long returnOrderBaseInfoNumber = this.count(new LambdaQueryWrapper<OrderBaseInfoDO>()
  2981 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  2982 + .eq(OrderBaseInfoDO::getReturnOrder, Constant.STRING_ONE)
  2983 + .likeRight(OrderBaseInfoDO::getInnerNo, "_____" + dateTime % 100));
  2984 +
2882 2985 Datecount datecount = new Datecount();
2883   - datecount.setTrackingAndInspectingList(tracking+inspecting);
2884   - datecount.setAllCount(allMonthCount);
  2986 + datecount.setTrackingAndInspectingList(orderInit+returnOrderBaseInfoNumber-allMonthCountNoReturn-allMonthCountReturn);
  2987 + datecount.setAllCount(allMonthCountNoReturn+allMonthCountReturn);
2885 2988 datecount.setProfitList(profit);
2886 2989 datecount.setReportList(report);
2887   - datecount.setOrderInitList(orderinit);
  2990 + datecount.setOrderInitList(orderInit+returnOrderBaseInfoNumber);
2888 2991 return ServerResult.success(datecount);
2889 2992 }
2890 2993 }
... ... @@ -2893,18 +2996,34 @@ end
2893 2996 int year = currentDate.getYear();
2894 2997 LocalDate startDate = LocalDate.of(year, currentMonth, 1);
2895 2998 LocalDate endDate = startDate.plusMonths(1);
2896   - long allDayCount=this.baseMapper.countAllDayvalueByOrderStatus(OrderStatusEnum.ORDER_FINISH.getStatus(),startDate,endDate);
2897   - long tracking = orderTrackStageService.countRecentDayvalueByOrderStatus(OrderStatusEnum.TRACK_ING.getStatus(),startDate,endDate);
  2999 + long allDayCountNoReturn=this.baseMapper.countAllDayvalueByOrderStatus(OrderStatusEnum.ORDER_FINISH.getStatus(),startDate,endDate,(long)year % 100);
  3000 + long allDayCountReturn = this.count(new LambdaQueryWrapper<OrderBaseInfoDO>()
  3001 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  3002 + .eq(OrderBaseInfoDO::getReturnOrder, Constant.STRING_ONE)
  3003 + .eq(OrderBaseInfoDO::getOrderStatus,OrderStatusEnum.ORDER_FINISH.getStatus())
  3004 + .ge(OrderBaseInfoDO::getCreateTime,startDate)
  3005 + .lt(OrderBaseInfoDO::getCreateTime,endDate)
  3006 + .likeRight(OrderBaseInfoDO::getInnerNo, "_____" + year % 100));
  3007 + /* long tracking = orderTrackStageService.countRecentDayvalueByOrderStatus(OrderStatusEnum.TRACK_ING.getStatus(),startDate,endDate);
  3008 + System.out.println("跟单中:"+tracking);
2898 3009 long inspecting = orderInspectionStageService.countRecentDayvalueByOrderStatus(OrderStatusEnum.INSPECT_ING.getStatus(),startDate,endDate);
  3010 + System.out.println("质检中:"+inspecting);*/
2899 3011 long profit= orderFieldLockApplyService.countRecentDayvalueByOrderStatus(ApplyTypeEnum.ORDER_PROFIT_APPLY.getType(),startDate,endDate);
2900 3012 long report=orderFieldLockApplyService.countRecentDayvalueByOrderStatus(ApplyTypeEnum.ORDER_REPORT_APPLY.getType(),startDate,endDate);
2901   - long orderinit=this.baseMapper.countRecentDayByOrderInit(startDate,endDate);
  3013 +
  3014 + long orderInit=this.baseMapper.countRecentDayByOrderInit(startDate,endDate, (long) (year % 100));
  3015 + long returnOrderBaseInfoNumber = this.count(new LambdaQueryWrapper<OrderBaseInfoDO>()
  3016 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  3017 + .eq(OrderBaseInfoDO::getReturnOrder, Constant.STRING_ONE)
  3018 + .ge(OrderBaseInfoDO::getCreateTime,startDate)
  3019 + .lt(OrderBaseInfoDO::getCreateTime,endDate)
  3020 + .likeRight(OrderBaseInfoDO::getInnerNo, "_____" + year % 100));
2902 3021 Datecount datecount = new Datecount();
2903   - datecount.setTrackingAndInspectingList(tracking+inspecting);
2904   - datecount.setAllCount(allDayCount);
  3022 + datecount.setTrackingAndInspectingList(orderInit+returnOrderBaseInfoNumber-allDayCountNoReturn-allDayCountReturn);
  3023 + datecount.setAllCount(allDayCountNoReturn+allDayCountReturn);
2905 3024 datecount.setProfitList(profit);
2906 3025 datecount.setReportList(report);
2907   - datecount.setOrderInitList(orderinit);
  3026 + datecount.setOrderInitList(orderInit+returnOrderBaseInfoNumber);
2908 3027 return ServerResult.success(datecount);
2909 3028 }
2910 3029  
... ... @@ -2922,11 +3041,11 @@ end
2922 3041 return ServerResult.success(dateYearMonthTimeVOS);
2923 3042 }
2924 3043 if (TimePeriod.MONTH.getDescription().equals(dateTimeVO.getPeriod())) {
2925   - // 查询当前月份的数据
  3044 + // 查询当前月份的数据
2926 3045 List<DateYearMonthTimeVO> dateYearMonthTimeVOS = this.baseMapper.countRecentMonthValueByOrderStatus(Arrays.asList(dateTimeVO.getDateTime()));
2927 3046 List<DateYearMonthTimeVO> combinedList = new ArrayList<>(dateYearMonthTimeVOS);
2928 3047  
2929   - // 查询对比的年份
  3048 + // 查询对比的年份
2930 3049 List<Integer> yearList = new ArrayList<>();
2931 3050 yearList.add(dateTimeVO.getDateTime());
2932 3051 if (CollectionUtils.isNotEmpty(dateTimeVO.getDateTimes())) {
... ... @@ -2935,24 +3054,24 @@ end
2935 3054 yearList.addAll(dateTimeVO.getDateTimes());
2936 3055 }
2937 3056  
2938   - // 使用 Map 来存储已有的日期信息,避免重复遍历
  3057 + // 使用 Map 来存储已有的日期信息,避免重复遍历
2939 3058 Map<String, DateYearMonthTimeVO> existingDates = new HashMap<>();
2940 3059  
2941   - // 将已有数据存储到 Map 中
  3060 + // 将已有数据存储到 Map 中
2942 3061 for (DateYearMonthTimeVO item : combinedList) {
2943 3062 existingDates.put(item.getDate(), item);
2944 3063 }
2945 3064  
2946   - // 遍历年份和月份,补充缺失月份
  3065 + // 遍历年份和月份,补充缺失月份
2947 3066 for (Integer targetYear : yearList) {
2948 3067 for (int month = 1; month <= 12; month++) {
2949 3068 String monthStr = String.format("%s-%02d", targetYear, month);
2950   - // 如果该月份没有数据,则补充
  3069 + // 如果该月份没有数据,则补充
2951 3070 existingDates.putIfAbsent(monthStr, new DateYearMonthTimeVO(monthStr, 0L ,String.valueOf(targetYear)));
2952 3071 }
2953 3072 }
2954 3073  
2955   - // 更新日期前缀
  3074 + // 更新日期前缀
2956 3075 existingDates.forEach((key, item) -> {
2957 3076 String[] dateParts = item.getDate().split("-");
2958 3077 if (dateParts.length == 2) {
... ... @@ -2960,7 +3079,7 @@ end
2960 3079 }
2961 3080 });
2962 3081  
2963   - // 返回最终结果
  3082 + // 返回最终结果
2964 3083 return ServerResult.success(new ArrayList<>(existingDates.values()));
2965 3084 }
2966 3085  
... ... @@ -2975,6 +3094,45 @@ end
2975 3094 return ServerResult.success(dateYearMonthTimeVOS);
2976 3095 }
2977 3096  
  3097 + @Override
  3098 + public ServerResult accountStatement(HttpServletResponse response,AccountStatementVO accountStatementVO) throws IOException {
  3099 + if(CollectionUtils.isEmpty(accountStatementVO.getIds())){
  3100 + return ServerResult.fail("请选中订单!");
  3101 + }
  3102 + List<OrderFieldLockApplyDO> orderFieldLockApplyDOS = orderFieldLockApplyService.list(new LambdaQueryWrapper<OrderFieldLockApplyDO>()
  3103 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  3104 + .in(OrderFieldLockApplyDO::getOrderId, accountStatementVO.getIds())
  3105 + .eq(OrderFieldLockApplyDO::getType, ApplyTypeEnum.ORDER_PROFIT_APPLY.getType())
  3106 + .eq(OrderFieldLockApplyDO::getStatus,ApplyStatusEnum.WAIT_AUDIT.getStatus()));
  3107 + if(CollectionUtils.isNotEmpty(orderFieldLockApplyDOS)){
  3108 + return ServerResult.fail("订单中包含利润未审批的订单,无法生成!");
  3109 + }
  3110 + List<OrderProfitAnalysisDO> orderProfitAnalysisDOList = profitAnalysisService.list(new LambdaQueryWrapper<OrderProfitAnalysisDO>()
  3111 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  3112 + .in(OrderProfitAnalysisDO::getOrderId, accountStatementVO.getIds()));
  3113 + if(CollectionUtils.isEmpty(orderProfitAnalysisDOList) || accountStatementVO.getIds().size() > orderProfitAnalysisDOList.size()){
  3114 + return ServerResult.fail("利润分析未填写,无法进行生成!");
  3115 + }
  3116 + List<OrderBaseInfoDO> orderBaseInfoDOList = listByIds(accountStatementVO.getIds());
  3117 + Map<Long, OrderProfitAnalysisDO> orderProfitAnalysisDOMap = orderProfitAnalysisDOList.stream().collect(Collectors.toMap(OrderProfitAnalysisDO::getOrderId, Function.identity(), (x, y) -> x));
  3118 +
  3119 + List<AccountStatementExcelVO> accountStatementExcelVOList = orderBaseInfoDOList.stream().map(x -> {
  3120 + AccountStatementExcelVO accountStatementExcelVO = new AccountStatementExcelVO();
  3121 + BeanUtils.copyProperties(x, accountStatementExcelVO);
  3122 + OrderProfitAnalysisDO orderProfitAnalysisDO = orderProfitAnalysisDOMap.get(x.getId());
  3123 + if (Objects.nonNull(orderProfitAnalysisDO)) {
  3124 + accountStatementExcelVO.setProductionDepartmentPrice(orderProfitAnalysisDO.getProductionDepartmentPrice());
  3125 + accountStatementExcelVO.setProductionDepartmentTotalPrice(orderProfitAnalysisDO.getProductionDepartmentTotalPrice());
  3126 + }
  3127 + return accountStatementExcelVO;
  3128 +
  3129 + }).collect(Collectors.toList());
  3130 + accountStatementExcelVOList.get(0).setDeduction(accountStatementVO.getDeduction());
  3131 + accountStatementExcelVOList.get(0).setDisbursement(accountStatementVO.getDisbursement());
  3132 + accountStatementExcelVOList.get(0).setTitleCompany(accountStatementVO.getTitleCompany());
  3133 + accountStatementExcel.AccountStatementExcel(response,accountStatementExcelVOList);
  3134 + return ServerResult.success();
  3135 + }
2978 3136  
2979 3137  
2980 3138 @Override
... ...
src/main/java/com/order/erp/service/order/impl/OrderFieldLockApplyServiceImpl.java
... ... @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
4 4 import cn.hutool.core.collection.CollUtil;
5 5 import com.alibaba.fastjson.JSONObject;
6 6 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  7 +import com.baomidou.mybatisplus.core.conditions.query.Query;
7 8 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
8 9 import com.baomidou.mybatisplus.core.metadata.IPage;
9 10 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
... ... @@ -14,9 +15,7 @@ import com.order.erp.common.constant.Constant;
14 15 import com.order.erp.common.constant.ServerResult;
15 16 import com.order.erp.common.constant.ServerResultCode;
16 17 import com.order.erp.common.exception.BusinessException;
17   -import com.order.erp.common.utils.EmailSendUtils;
18   -import com.order.erp.common.utils.OrderFieldUtils;
19   -import com.order.erp.common.utils.TransactionHelper;
  18 +import com.order.erp.common.utils.*;
20 19 import com.order.erp.config.DataScope;
21 20 import com.order.erp.domain.*;
22 21 import com.order.erp.domain.dto.BaseDO;
... ... @@ -25,6 +24,7 @@ import com.order.erp.domain.vo.order.*;
25 24 import com.order.erp.mapper.order.OrderFieldLockApplyMapper;
26 25 import com.order.erp.service.order.*;
27 26 import lombok.extern.slf4j.Slf4j;
  27 +import org.joda.time.DateTime;
28 28 import org.springframework.beans.BeanUtils;
29 29 import org.springframework.stereotype.Service;
30 30 import org.springframework.transaction.annotation.Transactional;
... ... @@ -32,6 +32,7 @@ import org.springframework.transaction.annotation.Transactional;
32 32 import javax.annotation.Resource;
33 33 import java.time.LocalDate;
34 34 import java.util.*;
  35 +import java.util.concurrent.TimeUnit;
35 36 import java.util.function.Function;
36 37 import java.util.stream.Collectors;
37 38  
... ... @@ -74,6 +75,8 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
74 75 private TransactionHelper transactionHelper;
75 76 @Resource
76 77 private EmailSendUtils emailSendUtils;
  78 + @Resource
  79 + private RedisUtils redisUtils;
77 80  
78 81 /**
79 82 * 通过ID查询单条数据
... ... @@ -131,37 +134,71 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
131 134 fieldVO.setProfitAnalysisFields(JSONObject.parseObject(fields, OrderProfitAnalysisFieldVO.class));
132 135 resultVO.setFieldInfos(fieldVO);
133 136 }
134   - if (ApplyTypeEnum.INVOICE_BILL_APPLY.getType().equals(x.getType())) {
  137 + if (ApplyTypeEnum.INVOICE_BILL_APPLY.getType().equals(x.getType()) || ApplyTypeEnum.INVOICE_DEDUCT_URL.getType().equals(x.getType()) ) {
135 138 OrderLockFieldVO orderLockFieldVO = JSONObject.parseObject(fields, OrderLockFieldVO.class);
  139 + //对于扣款单申请,需要看到扣款单的文件,所以这里需要oss实时获取。
  140 + if(ApplyTypeEnum.INVOICE_DEDUCT_URL.getType().equals(x.getType())){
  141 + DeductionUrlFieldVO deductionUrlFieldVO = orderLockFieldVO.getDeductionUrlFieldVO();
  142 + String invoiceDeductUrlKey = Constant.OSS_INVOICE_DEDUCT_URL + deductionUrlFieldVO.getDeductUrl();
  143 + String invoiceDeductUrl=(String)redisUtils.get(invoiceDeductUrlKey);
  144 + if(StringUtils.isBlank(invoiceDeductUrl)){
  145 + invoiceDeductUrl = AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(deductionUrlFieldVO.getDeductUrl()), SplitUrlGetBucketName.getFileName(deductionUrlFieldVO.getDeductUrl()), new DateTime().plusHours(Constant.TWO).toDate());
  146 + redisUtils.set(invoiceDeductUrlKey,invoiceDeductUrl,Constant.ONEPOINTNINE_HOURS,TimeUnit.SECONDS);
  147 + }
  148 + deductionUrlFieldVO.setDeductUrl(invoiceDeductUrl);
  149 + }
136 150 if(RoleEnum.BUSINESS_USER.getCode().equals(roleEnum.getCode())){
137   - if(Objects.nonNull(orderLockFieldVO.getInvoiceFieldVO()) && orderLockFieldVO.getInvoiceFieldVO().getBusinesPerson().equals(loginUserName)){
138   - resultVO.setFieldInfos(JSONObject.parseObject(fields, OrderLockFieldVO.class));
  151 + if(Objects.nonNull(orderLockFieldVO.getInvoiceFieldVO()) && orderLockFieldVO.getInvoiceFieldVO().getBusinesPerson().equals(loginUserName) || Objects.nonNull(orderLockFieldVO.getDeductionUrlFieldVO()) && orderLockFieldVO.getDeductionUrlFieldVO().getBusinesPerson().equals(loginUserName)){
  152 + resultVO.setFieldInfos(orderLockFieldVO);
139 153 }
140 154 } else if (RoleEnum.TRACKER_USER.getCode().equals(roleEnum.getCode())) {
141   - if(Objects.nonNull(orderLockFieldVO.getInvoiceFieldVO()) && orderLockFieldVO.getInvoiceFieldVO().getTrackerUser().equals(loginUserName)){
142   - resultVO.setFieldInfos(JSONObject.parseObject(fields, OrderLockFieldVO.class));
  155 + if(Objects.nonNull(orderLockFieldVO.getInvoiceFieldVO()) && orderLockFieldVO.getInvoiceFieldVO().getTrackerUser().equals(loginUserName) || Objects.nonNull(orderLockFieldVO.getDeductionUrlFieldVO()) && orderLockFieldVO.getDeductionUrlFieldVO().getTrackerUser().equals(loginUserName)){
  156 + resultVO.setFieldInfos(orderLockFieldVO);
143 157 }
144 158 } else{
145   - resultVO.setFieldInfos(JSONObject.parseObject(fields, OrderLockFieldVO.class));
  159 + resultVO.setFieldInfos(orderLockFieldVO);
146 160 }
147 161 if(Objects.isNull(resultVO.getFieldInfos())){
148 162 resultVO=null;
149 163 }
150 164 }
151   - if (ApplyTypeEnum.CHECK_BILL_APPLY.getType().equals(x.getType()) || ApplyTypeEnum.DEPARTMENT_INVOICE_APPLY.getType().equals(x.getType())) {
  165 + if (ApplyTypeEnum.CHECK_BILL_APPLY.getType().equals(x.getType()) || ApplyTypeEnum.DEPARTMENT_INVOICE_APPLY.getType().equals(x.getType()) || ApplyTypeEnum.CHECK_DEDUCT_URL.getType().equals(x.getType())) {
152 166 OrderLockFieldVO orderLockFieldVO = JSONObject.parseObject(fields, OrderLockFieldVO.class);
153 167 // 解决待审批列表中的应付款要显示内部编码。 这里开始
154 168 //这部分的目的是,对于跟单员和业务员他们也能查看到应收款和应付款中各自负责订单的审核情况。 而财务和admin则会执行else{},会看到所有的审核订单信息。
  169 + if(ApplyTypeEnum.CHECK_DEDUCT_URL.getType().equals(x.getType())){
  170 + DeductionUrlFieldVO deductionUrlFieldVO = orderLockFieldVO.getDeductionUrlFieldVO();
  171 + String checkDeductUrlKey= Constant.OSS_CHECK_DEDUCT_URL+deductionUrlFieldVO.getDeductUrl();
  172 + String checkDeductUrl=(String)redisUtils.get(checkDeductUrlKey);
  173 + if(StringUtils.isBlank(checkDeductUrl)){
  174 + checkDeductUrl = AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(deductionUrlFieldVO.getDeductUrl()), SplitUrlGetBucketName.getFileName(deductionUrlFieldVO.getDeductUrl()), new DateTime().plusHours(Constant.TWO).toDate());
  175 + redisUtils.set(checkDeductUrlKey,checkDeductUrl,Constant.ONEPOINTNINE_HOURS, TimeUnit.SECONDS);
  176 + }
  177 + deductionUrlFieldVO.setDeductUrl(checkDeductUrl);
  178 + }else if(ApplyTypeEnum.DEPARTMENT_INVOICE_APPLY.getType().equals(x.getType())){
  179 + ProducePaymentCheckBillVO checkBillVO = orderLockFieldVO.getCheckBillVO();
  180 + String invoiceUrlKey = Constant.OSS_INVOICE_URL + checkBillVO.getInvoiceUrl();
  181 + String invoiceUrl =(String)redisUtils.get(invoiceUrlKey);
  182 + if(StringUtils.isBlank(invoiceUrl)){
  183 + invoiceUrl= AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(checkBillVO.getInvoiceUrl()), SplitUrlGetBucketName.getFileName(checkBillVO.getInvoiceUrl()), new DateTime().plusHours(Constant.TWO).toDate());
  184 + redisUtils.set(invoiceUrlKey,invoiceUrl,Constant.ONEPOINTNINE_HOURS,TimeUnit.SECONDS);
  185 + }
  186 + checkBillVO.setInvoiceUrl(invoiceUrl);
  187 + }
155 188 if(RoleEnum.BUSINESS_USER.getCode().equals(roleEnum.getCode())){
156   - if((Objects.nonNull(orderLockFieldVO.getProducePaymentCheckBillFieldVO()) && orderLockFieldVO.getProducePaymentCheckBillFieldVO().getBusinesPerson().equals(loginUserName))||(Objects.nonNull(orderLockFieldVO.getCheckBillVO()) && orderLockFieldVO.getCheckBillVO().getBusinesPerson().equals(loginUserName))){
157   - resultVO.setFieldInfos(JSONObject.parseObject(fields, OrderLockFieldVO.class));
  189 + if((Objects.nonNull(orderLockFieldVO.getProducePaymentCheckBillFieldVO()) && orderLockFieldVO.getProducePaymentCheckBillFieldVO().getBusinesPerson().equals(loginUserName))
  190 + ||(Objects.nonNull(orderLockFieldVO.getCheckBillVO()) && orderLockFieldVO.getCheckBillVO().getBusinesPerson().equals(loginUserName))
  191 + ||(Objects.nonNull(orderLockFieldVO.getDeductionUrlFieldVO()) && orderLockFieldVO.getDeductionUrlFieldVO().getBusinesPerson().equals(loginUserName))){
  192 + resultVO.setFieldInfos(orderLockFieldVO);
158 193 }
159 194 } else if (RoleEnum.TRACKER_USER.getCode().equals(roleEnum.getCode())) {
160   - if((Objects.nonNull(orderLockFieldVO.getProducePaymentCheckBillFieldVO()) && orderLockFieldVO.getProducePaymentCheckBillFieldVO().getTrackerUser().equals(loginUserName))||(Objects.nonNull(orderLockFieldVO.getCheckBillVO()) && orderLockFieldVO.getCheckBillVO().getTrackerUser().equals(loginUserName))){
161   - resultVO.setFieldInfos(JSONObject.parseObject(fields, OrderLockFieldVO.class));
  195 + if((Objects.nonNull(orderLockFieldVO.getProducePaymentCheckBillFieldVO()) && orderLockFieldVO.getProducePaymentCheckBillFieldVO().getTrackerUser().equals(loginUserName))
  196 + ||(Objects.nonNull(orderLockFieldVO.getCheckBillVO()) && orderLockFieldVO.getCheckBillVO().getTrackerUser().equals(loginUserName))
  197 + ||(Objects.nonNull(orderLockFieldVO.getDeductionUrlFieldVO()) && orderLockFieldVO.getDeductionUrlFieldVO().getTrackerUser().equals(loginUserName))){
  198 + resultVO.setFieldInfos(orderLockFieldVO);
162 199 }
163 200 } else{
164   - resultVO.setFieldInfos(JSONObject.parseObject(fields, OrderLockFieldVO.class));
  201 + resultVO.setFieldInfos(orderLockFieldVO);
165 202 }
166 203 if(Objects.isNull(resultVO.getFieldInfos())){
167 204 resultVO=null;
... ... @@ -172,7 +209,9 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
172 209 }).filter(result->result!=null).collect(Collectors.toList());
173 210 if (resultVOList != null && resultVOList.stream().noneMatch(x -> ApplyTypeEnum.INVOICE_BILL_APPLY.getType().equals(x.getType())
174 211 || ApplyTypeEnum.DEPARTMENT_INVOICE_APPLY.getType().equals(x.getType())
175   - || ApplyTypeEnum.CHECK_BILL_APPLY.getType().equals(x.getType()))) {
  212 + || ApplyTypeEnum.CHECK_BILL_APPLY.getType().equals(x.getType())
  213 + || ApplyTypeEnum.INVOICE_DEDUCT_URL.getType().equals(x.getType())
  214 + || ApplyTypeEnum.CHECK_DEDUCT_URL.getType().equals(x.getType()))) {
176 215 fillOrderInfo(resultVOList);
177 216 }
178 217 }
... ... @@ -257,8 +296,20 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
257 296 if (orderBaseInfoDOMap.containsKey(x.getOrderId())) {
258 297 OrderBaseInfoDO orderBaseInfoDO = orderBaseInfoDOMap.get(x.getOrderId());
259 298 OrderBaseInfoVO orderBaseInfo = new OrderBaseInfoVO();
260   - BeanUtils.copyProperties(orderBaseInfoDO, orderBaseInfo);
  299 + BeanUtils.copyProperties(orderBaseInfoDO, orderBaseInfo,"picUrl","smallPicUrl");
261 300 x.setOrderBaseInfo(orderBaseInfo);
  301 + String picUrlKey = Constant.OSS_PIC_URL + orderBaseInfoDO.getPicUrl();
  302 + String smallPicUrlKey = Constant.OSS_SMALL_PIC_URL + orderBaseInfoDO.getSmallPicUrl();
  303 + String picUrl=(String)redisUtils.get(picUrlKey);
  304 + String smallPicUrl=(String)redisUtils.get(smallPicUrlKey);
  305 + if(StringUtils.isBlank(picUrl)){
  306 + picUrl= AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(orderBaseInfoDO.getPicUrl()), SplitUrlGetBucketName.getFileName(orderBaseInfoDO.getPicUrl()), new DateTime().plusHours(Constant.TWO).toDate());
  307 + }
  308 + if(StringUtils.isBlank(smallPicUrl)){
  309 + smallPicUrl= AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(orderBaseInfoDO.getSmallPicUrl()), SplitUrlGetBucketName.getFileName(orderBaseInfoDO.getSmallPicUrl()), new DateTime().plusHours(Constant.TWO).toDate());
  310 + }
  311 + x.getOrderBaseInfo().setSmallPicUrl(smallPicUrl);
  312 + x.getOrderBaseInfo().setPicUrl(picUrl);
262 313 }
263 314 });
264 315 }
... ... @@ -370,7 +421,8 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
370 421 }
371 422 Set<Long> orderIds = new HashSet<>();
372 423 //由于下面是原始的代码,怕改出错了,所以我只对我需要的需求进行判断,我只针对我需要的这种情况,其他情况下就不走这种情况。 限制情况为跟单业务,对应收款,应付款,发票审核请求时。
373   - if(queryVO.getType()==Constant.THIRTY || queryVO.getType()==4050){
  424 +// queryVO.getType==Constant.SIXTY完全是为了跟单和业务对于应收账单类型请求时,屏蔽掉应收账单,只展示invoice扣款单申请数据。
  425 + if(queryVO.getType()==Constant.THIRTY || queryVO.getType()==4050 || queryVO.getType()==Constant.SIXTY){
374 426  
375 427 }else{
376 428 /** 这部分代码是之前的,每台看懂,就先不修改了,保留*/
... ... @@ -403,7 +455,7 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
403 455 if(Constant.FOUR == String.valueOf(queryVO.getType()).length()){
404 456 int firstTwoDigits = queryVO.getType() / 100;
405 457 int lastTwoDigits = queryVO.getType() % 100;
406   - queryWrapper.in(OrderFieldLockApplyDO::getType,firstTwoDigits,lastTwoDigits);
  458 + queryWrapper.in(OrderFieldLockApplyDO::getType,firstTwoDigits,lastTwoDigits,ApplyTypeEnum.CHECK_DEDUCT_URL.getType());
407 459 //目前是只能通过内部编号查询出应付款审核,无法查询出发票信息。
408 460 if(CollectionUtils.isNotEmpty(queryVO.getInnerNo())){
409 461 String queryInnerNo = queryVO.getInnerNo().get(0).trim();
... ... @@ -411,23 +463,26 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
411 463 "(" +
412 464 "JSON_CONTAINS(JSON_EXTRACT(fields, '$.producePaymentCheckBillFieldVO.innerNo'), JSON_QUOTE({0})) " +
413 465 "OR JSON_UNQUOTE(JSON_EXTRACT(fields, '$.checkBillVO.innerNo')) = {0}" +
  466 + "OR JSON_UNQUOTE(JSON_EXTRACT(fields, '$.deductionUrlFieldVO.innerNo')) = {0}" +
414 467 ")",
415 468 queryInnerNo
416 469 );
417 470 }
418   - }else{
  471 + }else if(Objects.nonNull(queryVO.getType()) && queryVO.getType().equals(ApplyTypeEnum.INVOICE_BILL_APPLY.getType())){
419 472 //应收款审核。
420   - if(Objects.nonNull(queryVO.getType()) && queryVO.getType().equals(ApplyTypeEnum.INVOICE_BILL_APPLY.getType())){
421   - queryWrapper.eq(Objects.nonNull(queryVO.getType()), OrderFieldLockApplyDO::getType, queryVO.getType());
  473 + queryWrapper.in(Objects.nonNull(queryVO.getType()), OrderFieldLockApplyDO::getType, queryVO.getType(),ApplyTypeEnum.INVOICE_DEDUCT_URL.getType());
422 474 //这个内部编号单独针对于应付款申请设置的。
423 475 if(CollectionUtils.isNotEmpty(queryVO.getInnerNo())){
424 476 String queryInnerNo = queryVO.getInnerNo().get(0).trim();
425 477 queryWrapper.apply(
426   - "JSON_CONTAINS(JSON_EXTRACT(fields, '$.invoiceFieldVO.innerNo'), JSON_QUOTE({0}))",
  478 + "(" +
  479 + "JSON_CONTAINS(JSON_EXTRACT(fields, '$.invoiceFieldVO.innerNo'), JSON_QUOTE({0})) " +
  480 + "OR JSON_UNQUOTE(JSON_EXTRACT(fields, '$.deductionUrlFieldVO.innerNo')) = {0}" +
  481 + ")",
427 482 queryInnerNo
428 483 );
429 484 }
430   - }
  485 + }else{
431 486 //其他审核类型。
432 487 queryWrapper.eq(Objects.nonNull(queryVO.getType()), OrderFieldLockApplyDO::getType, queryVO.getType());
433 488 }
... ... @@ -440,9 +495,11 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
440 495 if (!invoiceNos.isEmpty()) {
441 496 // 使用参数化查询避免 SQL 拼接问题
442 497 queryWrapper.apply(
443   - "JSON_UNQUOTE(JSON_EXTRACT(fields, '$.invoiceFieldVO.invoiceNo')) like {0}",
444   - "%"+invoiceNos+"%"
  498 + "((JSON_UNQUOTE(JSON_EXTRACT(fields, '$.invoiceFieldVO.invoiceNo')) LIKE {0} " +
  499 + "OR JSON_UNQUOTE(JSON_EXTRACT(fields, '$.deductionUrlFieldVO.invoiceNo')) LIKE {0}))",
  500 + "%" + invoiceNos + "%"
445 501 );
  502 +
446 503 }
447 504 }
448 505  
... ... @@ -455,15 +512,18 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
455 512 // 使用括号分组确保逻辑优先级正确
456 513 queryWrapper.apply(
457 514 "((JSON_UNQUOTE(JSON_EXTRACT(fields, '$.producePaymentCheckBillFieldVO.checkNo')) like {0}) " +
458   - "OR (JSON_UNQUOTE(JSON_EXTRACT(fields, '$.checkBillVO.checkNo')) like {0}))",
  515 + "OR (JSON_UNQUOTE(JSON_EXTRACT(fields, '$.checkBillVO.checkNo')) like {0})" +
  516 + "OR (JSON_UNQUOTE(JSON_EXTRACT(fields, '$.deductionUrlFieldVO.checkNo')) like {0})" +
  517 + ")",
459 518 "%"+checkNos+"%"
460 519 );
461 520 }
462 521 }
463 522 //由于不懂下面的代码,所以我只对我需要的需求进行判断,我只针对我需要的这种情况,其他情况下就不走这种情况。
464   - if(RoleEnum.TRACKER_USER.getCode().equals(roleEnum.getCode()) && (queryVO.getType()==Constant.THIRTY || queryVO.getType()==4050)){
  523 + // queryVO.getType==Constant.SIXTY完全是为了跟单和业务对于应收账单类型请求时,屏蔽掉应收账单,只展示invoice扣款单申请数据。
  524 + if(RoleEnum.TRACKER_USER.getCode().equals(roleEnum.getCode()) && (queryVO.getType()==Constant.THIRTY || queryVO.getType()==4050 || queryVO.getType() ==Constant.SIXTY)){
465 525  
466   - }else if(RoleEnum.BUSINESS_USER.getCode().equals(roleEnum.getCode()) && (queryVO.getType()==Constant.THIRTY || queryVO.getType()==4050)){
  526 + }else if(RoleEnum.BUSINESS_USER.getCode().equals(roleEnum.getCode()) && (queryVO.getType()==Constant.THIRTY || queryVO.getType()==4050 || queryVO.getType() ==Constant.SIXTY)){
467 527  
468 528 }else{
469 529 if (Objects.isNull(roleSelect)) {
... ... @@ -512,6 +572,94 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
512 572 return ServerResult.success();
513 573 }
514 574  
  575 + @Override
  576 + public ServerResult audit_detail(AuditDetailQueryVO auditDetailQueryVO) {
  577 + if(Objects.isNull(auditDetailQueryVO.getId())){
  578 + throw new BusinessException(ServerResultCode.PARAM_ERROR);
  579 + }
  580 + OrderFieldLockApplyDO orderFieldLockApplyDO = getById(auditDetailQueryVO.getId());
  581 + if(Objects.isNull(orderFieldLockApplyDO)){
  582 + throw new BusinessException(ServerResultCode.EMPTY_RESULT);
  583 + }
  584 + OrderLockFieldVO orderLockFieldVO = JSONObject.parseObject(orderFieldLockApplyDO.getFields(), OrderLockFieldVO.class);
  585 + //应付款类型。
  586 + if(ApplyTypeEnum.CHECK_BILL_APPLY.getType().equals(orderFieldLockApplyDO.getType()) || ApplyTypeEnum.DEPARTMENT_INVOICE_APPLY.getType().equals(orderFieldLockApplyDO.getType()) || ApplyTypeEnum.CHECK_DEDUCT_URL.getType().equals(orderFieldLockApplyDO.getType())){
  587 + LambdaQueryWrapper<ProducePaymentCheckBillOrderDO> lambdaQueryWrapper = new LambdaQueryWrapper<ProducePaymentCheckBillOrderDO>().eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN);
  588 + if(ApplyTypeEnum.CHECK_BILL_APPLY.getType().equals(orderFieldLockApplyDO.getType())){
  589 + ProducePaymentCheckBillFieldVO producePaymentCheckBillFieldVO = orderLockFieldVO.getProducePaymentCheckBillFieldVO();
  590 + lambdaQueryWrapper.in(ProducePaymentCheckBillOrderDO::getId, producePaymentCheckBillFieldVO.getProducePaymentCheckBillId());
  591 + }else if(ApplyTypeEnum.DEPARTMENT_INVOICE_APPLY.getType().equals(orderFieldLockApplyDO.getType())){
  592 + ProducePaymentCheckBillVO producePaymentCheckBillVO = orderLockFieldVO.getCheckBillVO();
  593 + lambdaQueryWrapper.eq(ProducePaymentCheckBillOrderDO::getId,producePaymentCheckBillVO.getId());
  594 + }else if(ApplyTypeEnum.CHECK_DEDUCT_URL.getType().equals(orderFieldLockApplyDO.getType())){
  595 + DeductionUrlFieldVO deductionUrlFieldVO = orderLockFieldVO.getDeductionUrlFieldVO();
  596 + lambdaQueryWrapper.eq(ProducePaymentCheckBillOrderDO::getId,deductionUrlFieldVO.getId());
  597 + }
  598 + List<ProducePaymentCheckBillOrderDO> producePaymentCheckBillOrderDOList = checkBillOrderService.list(lambdaQueryWrapper);
  599 + List<Long> orderIds = producePaymentCheckBillOrderDOList.stream().map(producePaymentCheckBillOrderDO -> producePaymentCheckBillOrderDO.getOrderId()).collect(Collectors.toList());
  600 + //查询基础信息
  601 + List<OrderBaseInfoDO> orderBaseInfoDOList = orderBaseInfoService.listByIds(orderIds);
  602 + Map<Long, OrderBaseInfoDO> orderBaseInfoDOMap = orderBaseInfoDOList.stream().collect(Collectors.toMap(OrderBaseInfoDO::getId, order -> order, (existing, duplicate) -> existing));
  603 + //查询价格。
  604 + List<OrderProfitAnalysisDO> orderProfitAnalysisDOList = profitAnalysisService.list( new LambdaQueryWrapper<OrderProfitAnalysisDO>().eq(BaseDO::getEnableFlag,Constant.ENABLE_TEN)
  605 + .in(OrderProfitAnalysisDO::getOrderId,orderIds));
  606 + Map<Long, OrderProfitAnalysisDO> orderProfitAnalysisDOMap = orderProfitAnalysisDOList.stream().collect(Collectors.toMap(OrderProfitAnalysisDO::getOrderId, orderProfit -> orderProfit, (existing, duplicate) -> existing));
  607 + List<CheckBillResultVO> checkBillResultVOList = producePaymentCheckBillOrderDOList.stream().map(producePaymentCheckBillOrderDO -> {
  608 + CheckBillResultVO checkBillResultVO = new CheckBillResultVO();
  609 + if (orderBaseInfoDOMap.containsKey(producePaymentCheckBillOrderDO.getOrderId()) && orderProfitAnalysisDOMap.containsKey(producePaymentCheckBillOrderDO.getOrderId())) {
  610 + BeanUtils.copyProperties(producePaymentCheckBillOrderDO, checkBillResultVO, "projectNo", "productionDepartment", "innerNo", "smallPicUrl", "orderCount", "modeleLo", "productionDepartmentPrice", "productionDepartmentTotalPrice");
  611 + checkBillResultVO.setOrderId(producePaymentCheckBillOrderDO.getOrderId());
  612 + checkBillResultVO.setProjectNo(orderBaseInfoDOMap.get(producePaymentCheckBillOrderDO.getOrderId()).getProjectNo());
  613 + checkBillResultVO.setProductionDepartment(orderBaseInfoDOMap.get(producePaymentCheckBillOrderDO.getOrderId()).getProductionDepartment());
  614 + checkBillResultVO.setInnerNo(orderBaseInfoDOMap.get(producePaymentCheckBillOrderDO.getOrderId()).getInnerNo());
  615 + checkBillResultVO.setSmallPicUrl(orderBaseInfoDOMap.get(producePaymentCheckBillOrderDO.getOrderId()).getSmallPicUrl());
  616 + checkBillResultVO.setOrderCount(orderBaseInfoDOMap.get(producePaymentCheckBillOrderDO.getOrderId()).getOrderCount());
  617 + checkBillResultVO.setModeleLo(orderBaseInfoDOMap.get(producePaymentCheckBillOrderDO.getOrderId()).getModeleLo());
  618 + checkBillResultVO.setProductionDepartmentPrice(orderProfitAnalysisDOMap.get(producePaymentCheckBillOrderDO.getOrderId()).getProductionDepartmentPrice());
  619 + checkBillResultVO.setProductionDepartmentTotalPrice(orderProfitAnalysisDOMap.get(producePaymentCheckBillOrderDO.getOrderId()).getProductionDepartmentTotalPrice());
  620 + }
  621 + return checkBillResultVO;
  622 + }).collect(Collectors.toList());
  623 + return ServerResult.success(checkBillResultVOList);
  624 + //应收款类型
  625 + }else if(ApplyTypeEnum.INVOICE_BILL_APPLY.getType().equals(orderFieldLockApplyDO.getType()) || ApplyTypeEnum.INVOICE_DEDUCT_URL.getType().equals(orderFieldLockApplyDO.getType())){
  626 + LambdaQueryWrapper<InvoiceBillOrderDO> invoiceBillOrderDOLambdaQueryWrapper = new LambdaQueryWrapper<InvoiceBillOrderDO>().eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN);
  627 + if(ApplyTypeEnum.INVOICE_BILL_APPLY.getType().equals(orderFieldLockApplyDO.getType())){
  628 + InvoiceFieldVO invoiceFieldVO = orderLockFieldVO.getInvoiceFieldVO();
  629 + invoiceBillOrderDOLambdaQueryWrapper.in(InvoiceBillOrderDO::getId,invoiceFieldVO.getInvoiceId());
  630 + }else if(ApplyTypeEnum.INVOICE_DEDUCT_URL.getType().equals(orderFieldLockApplyDO.getType())){
  631 + DeductionUrlFieldVO deductionUrlFieldVO = orderLockFieldVO.getDeductionUrlFieldVO();
  632 + invoiceBillOrderDOLambdaQueryWrapper.eq(InvoiceBillOrderDO::getId,deductionUrlFieldVO.getId());
  633 + }
  634 + List<InvoiceBillOrderDO> invoiceBillOrderDOList = invoiceBillOrderService.list(invoiceBillOrderDOLambdaQueryWrapper);
  635 + List<Long> orderIds = invoiceBillOrderDOList.stream().map(invoiceBillOrderDO -> invoiceBillOrderDO.getOrderId()).collect(Collectors.toList());
  636 + //查询基础信息
  637 + List<OrderBaseInfoDO> orderBaseInfoDOList = orderBaseInfoService.listByIds(orderIds);
  638 + Map<Long, OrderBaseInfoDO> orderBaseInfoDOMap = orderBaseInfoDOList.stream().collect(Collectors.toMap(OrderBaseInfoDO::getId, order -> order, (existing, duplicate) -> existing));
  639 + //查询价格。
  640 + List<OrderProfitAnalysisDO> orderProfitAnalysisDOList = profitAnalysisService.list(new LambdaQueryWrapper<OrderProfitAnalysisDO>().eq(BaseDO::getEnableFlag,Constant.ENABLE_TEN)
  641 + .in(OrderProfitAnalysisDO::getOrderId,orderIds));
  642 + Map<Long, OrderProfitAnalysisDO> orderProfitAnalysisDOMap = orderProfitAnalysisDOList.stream().collect(Collectors.toMap(OrderProfitAnalysisDO::getOrderId, orderProfit -> orderProfit, (existing, duplicate) -> existing));
  643 + List<InvoiceResultVO> invoiceResultVOList = invoiceBillOrderDOList.stream().map(invoiceBillOrderDO -> {
  644 + InvoiceResultVO invoiceResultVO = new InvoiceResultVO();
  645 + if (orderBaseInfoDOMap.containsKey(invoiceBillOrderDO.getOrderId()) && orderProfitAnalysisDOMap.containsKey(invoiceBillOrderDO.getOrderId())) {
  646 + BeanUtils.copyProperties(invoiceBillOrderDO, invoiceResultVO, "projectNo", "productionDepartment", "innerNo", "smallPicUrl", "orderCount", "modeleLo", "customerPrice", "customerTotalPrice");
  647 + invoiceResultVO.setOrderId(invoiceBillOrderDO.getOrderId());
  648 + invoiceResultVO.setProjectNo(orderBaseInfoDOMap.get(invoiceBillOrderDO.getOrderId()).getProjectNo());
  649 + invoiceResultVO.setProductionDepartment(orderBaseInfoDOMap.get(invoiceBillOrderDO.getOrderId()).getProductionDepartment());
  650 + invoiceResultVO.setInnerNo(orderBaseInfoDOMap.get(invoiceBillOrderDO.getOrderId()).getInnerNo());
  651 + invoiceResultVO.setSmallPicUrl(orderBaseInfoDOMap.get(invoiceBillOrderDO.getOrderId()).getSmallPicUrl());
  652 + invoiceResultVO.setOrderCount(orderBaseInfoDOMap.get(invoiceBillOrderDO.getOrderId()).getOrderCount());
  653 + invoiceResultVO.setModeleLo(orderBaseInfoDOMap.get(invoiceBillOrderDO.getOrderId()).getModeleLo());
  654 + invoiceResultVO.setCustomerPrice(orderProfitAnalysisDOMap.get(invoiceBillOrderDO.getOrderId()).getCustomerPrice());
  655 + invoiceResultVO.setCustomerTotalPrice(orderProfitAnalysisDOMap.get(invoiceBillOrderDO.getOrderId()).getCustomerTotalPrice());
  656 + }
  657 + return invoiceResultVO;
  658 + }).collect(Collectors.toList());
  659 + return ServerResult.success(invoiceResultVOList);
  660 + }
  661 + return ServerResult.success();
  662 + }
515 663 @Transactional(rollbackFor = Exception.class)
516 664 public void doRefuse(OrderFieldLockApplyDO applyDO, Long auditUserId, String refuseRemark) {
517 665 applyDO.setAuditUserId(auditUserId);
... ... @@ -519,7 +667,11 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
519 667 applyDO.setRefuseRemark(refuseRemark);
520 668 //应收款和应付款的申请,没有把orderId作为OrderFieldLockApplyDO的orderId,而是把InvoiceBillOrdeDO.getId()作为orderId来存储的。所以肯定查找不到。
521 669 OrderBaseInfoDO orderBaseInfoDO = orderBaseInfoService.getById(applyDO.getOrderId());
522   - if(!ApplyTypeEnum.INVOICE_BILL_APPLY.getType().equals(applyDO.getType()) && !ApplyTypeEnum.CHECK_BILL_APPLY.getType().equals(applyDO.getType()) && !ApplyTypeEnum.DEPARTMENT_INVOICE_APPLY.getType().equals(applyDO.getType())){
  670 + if(!ApplyTypeEnum.INVOICE_BILL_APPLY.getType().equals(applyDO.getType())
  671 + && !ApplyTypeEnum.CHECK_BILL_APPLY.getType().equals(applyDO.getType())
  672 + && !ApplyTypeEnum.DEPARTMENT_INVOICE_APPLY.getType().equals(applyDO.getType())
  673 + && !ApplyTypeEnum.INVOICE_DEDUCT_URL.getType().equals(applyDO.getType())
  674 + && !ApplyTypeEnum.CHECK_DEDUCT_URL.getType().equals(applyDO.getType())){
523 675 if (Objects.isNull(orderBaseInfoDO)) {
524 676 throw new BusinessException(ServerResultCode.ORDER_BASE_INFO_EMPTY);
525 677 }
... ... @@ -546,6 +698,15 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
546 698 } else if (ApplyTypeEnum.INVOICE_BILL_APPLY.getType().equals(applyDO.getType())) {
547 699 OrderLockFieldVO lockFieldVO = JSONObject.parseObject(applyDO.getFields(), OrderLockFieldVO.class);
548 700 InvoiceFieldVO invoiceBillOrderDO = lockFieldVO.getInvoiceFieldVO();
  701 + //查询是否存在未审核的扣款单。
  702 + List<OrderFieldLockApplyDO> InvoiceDeductUrlList = list(new LambdaQueryWrapper<OrderFieldLockApplyDO>()
  703 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  704 + .in(OrderFieldLockApplyDO::getOrderId, invoiceBillOrderDO.getInvoiceId())
  705 + .eq(OrderFieldLockApplyDO::getType, ApplyTypeEnum.INVOICE_DEDUCT_URL.getType())
  706 + .eq(OrderFieldLockApplyDO::getStatus, ApplyStatusEnum.WAIT_AUDIT));
  707 + if(CollectionUtils.isNotEmpty(InvoiceDeductUrlList)){
  708 + throw new BusinessException("该Invoice存在未审批的扣款单,请先审批该对账单的扣款单!");
  709 + }
549 710 List<InvoiceBillOrderDO> invoiceBillOrderDOList = invoiceBillOrderService.listByIds(invoiceBillOrderDO.getInvoiceId());
550 711 if(CollectionUtils.isNotEmpty(invoiceBillOrderDOList)){
551 712 List<InvoiceBillOrderDO> invoiceBillOrderDOS = invoiceBillOrderDOList.stream().filter(Objects::nonNull).map(x -> {
... ... @@ -586,6 +747,15 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
586 747 if(CollectionUtils.isNotEmpty(producePayCheckBillInvoiceUrlList)){
587 748 throw new BusinessException("该生产科对账单存在未审批的发票,请先审批该对账单的发票!");
588 749 }
  750 + //查询是否存在未审核的扣款单。
  751 + List<OrderFieldLockApplyDO> InvoiceDeductUrlList = list(new LambdaQueryWrapper<OrderFieldLockApplyDO>()
  752 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  753 + .in(OrderFieldLockApplyDO::getOrderId, producePaymentCheckBillId)
  754 + .eq(OrderFieldLockApplyDO::getType, ApplyTypeEnum.CHECK_DEDUCT_URL.getType())
  755 + .eq(OrderFieldLockApplyDO::getStatus, ApplyStatusEnum.WAIT_AUDIT));
  756 + if(CollectionUtils.isNotEmpty(InvoiceDeductUrlList)){
  757 + throw new BusinessException("该生产科对账单存在未审批的扣款单,请先审批该对账单的扣款单!");
  758 + }
589 759 List<ProducePaymentCheckBillOrderDO> producePaymentCheckBillOrderDOList = checkBillOrderService.listByIds(producePaymentCheckBillId);
590 760 if(CollectionUtils.isNotEmpty(producePaymentCheckBillOrderDOList)){
591 761 List<ProducePaymentCheckBillOrderDO> producePaymentCheckBillOrderDOS= producePaymentCheckBillOrderDOList.stream().filter(Objects::nonNull).map(x -> {
... ... @@ -642,6 +812,60 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
642 812 invoiceAndCheckBillSendEmailVO.setCheckBillOrderDO(invoiceInfoDO);
643 813 invoiceAndCheckBillSendEmailVO.setRefuseRemark(refuseRemark);
644 814 emailSendUtils.sendInvoiceAndCheckEmail(FinanceOverEnum.CHECK_INVOICEURL_FAIL,invoiceAndCheckBillSendEmailVO,false);
  815 + }else if(ApplyTypeEnum.INVOICE_DEDUCT_URL.getType().equals(applyDO.getType())){
  816 + OrderLockFieldVO lockFieldVO = JSONObject.parseObject(applyDO.getFields(), OrderLockFieldVO.class);
  817 + DeductionUrlFieldVO deductionUrlFieldVO = lockFieldVO.getDeductionUrlFieldVO();
  818 + //得到旧的。
  819 + InvoiceBillOrderDO invoiceBillOrderDO=invoiceBillOrderService.getById(deductionUrlFieldVO.getId());
  820 + invoiceBillOrderDO.setInvoiceDeductUrlStatus(ApplyStatusEnum.AUDIT_REFUSE.getStatus());
  821 + //传递给审核一直都是最新的发票。
  822 + if(com.order.erp.common.utils.StringUtils.isNotBlank(invoiceBillOrderDO.getDeductUrl())){
  823 + if(Arrays.stream(invoiceBillOrderDO.getDeductUrl().split(",")).anyMatch(item->item.equals(deductionUrlFieldVO.getDeductUrl()))){
  824 + // 将 invoiceUrls 分割成 List 并删除相同项
  825 + List<String> urlList = new ArrayList<>(Arrays.asList(invoiceBillOrderDO.getDeductUrl().split(",")));
  826 + urlList.removeIf(url -> url.equals(deductionUrlFieldVO.getDeductUrl()));
  827 +
  828 + // 将更新后的 List 转换回逗号分隔的字符串并重新设置
  829 + String updatedInvoiceUrls = String.join(",", urlList);
  830 + invoiceBillOrderDO.setDeductUrl(updatedInvoiceUrls);
  831 + }
  832 + }else{
  833 + invoiceBillOrderDO.setDeductUrl(null);
  834 + }
  835 + invoiceBillOrderService.updateById(invoiceBillOrderDO);
  836 + //发送邮件通知跟单员和业务员。
  837 + //发送邮箱通知财务。 这里这个邮箱通知财务,只能提示invoice号,因为一个invoice申请对应多个invoice号,所以会有多个内部编号和项目号等。
  838 + InvoiceAndCheckBillSendEmailVO invoiceAndCheckBillSendEmailVO = new InvoiceAndCheckBillSendEmailVO();
  839 + invoiceAndCheckBillSendEmailVO.setDeductionUrlFieldVO(deductionUrlFieldVO);
  840 + invoiceAndCheckBillSendEmailVO.setRefuseRemark(refuseRemark);
  841 + emailSendUtils.sendInvoiceAndCheckEmail(FinanceOverEnum.INVOICE_FAIL,invoiceAndCheckBillSendEmailVO,false);
  842 + }else if(ApplyTypeEnum.CHECK_DEDUCT_URL.getType().equals(applyDO.getType())){
  843 + OrderLockFieldVO lockFieldVO = JSONObject.parseObject(applyDO.getFields(), OrderLockFieldVO.class);
  844 + DeductionUrlFieldVO deductionUrlFieldVO = lockFieldVO.getDeductionUrlFieldVO();
  845 + //得到旧的。
  846 + ProducePaymentCheckBillOrderDO checkBillOrderDO=checkBillOrderService.getById(deductionUrlFieldVO.getId());
  847 + checkBillOrderDO.setCheckDeductUrlStatus(ApplyStatusEnum.AUDIT_REFUSE.getStatus());
  848 + //传递给审核一直都是最新的发票。
  849 + if(com.order.erp.common.utils.StringUtils.isNotBlank(checkBillOrderDO.getDeductUrl())){
  850 + if(Arrays.stream(checkBillOrderDO.getDeductUrl().split(",")).anyMatch(item->item.equals(deductionUrlFieldVO.getDeductUrl()))){
  851 + // 将 invoiceUrls 分割成 List 并删除相同项
  852 + List<String> urlList = new ArrayList<>(Arrays.asList(checkBillOrderDO.getDeductUrl().split(",")));
  853 + urlList.removeIf(url -> url.equals(deductionUrlFieldVO.getDeductUrl()));
  854 +
  855 + // 将更新后的 List 转换回逗号分隔的字符串并重新设置
  856 + String updatedInvoiceUrls = String.join(",", urlList);
  857 + checkBillOrderDO.setDeductUrl(updatedInvoiceUrls);
  858 + }
  859 + }else{
  860 + checkBillOrderDO.setDeductUrl(null);
  861 + }
  862 + checkBillOrderService.updateById(checkBillOrderDO);
  863 + //发送邮件通知跟单员和业务员。
  864 + //发送邮箱通知财务。 这里这个邮箱通知财务,只能提示invoice号,因为一个invoice申请对应多个invoice号,所以会有多个内部编号和项目号等。
  865 + InvoiceAndCheckBillSendEmailVO invoiceAndCheckBillSendEmailVO = new InvoiceAndCheckBillSendEmailVO();
  866 + invoiceAndCheckBillSendEmailVO.setDeductionUrlFieldVO(deductionUrlFieldVO);
  867 + invoiceAndCheckBillSendEmailVO.setRefuseRemark(refuseRemark);
  868 + emailSendUtils.sendInvoiceAndCheckEmail(FinanceOverEnum.CHECK_FAIL,invoiceAndCheckBillSendEmailVO,false);
645 869 }
646 870  
647 871 OrderAuditLogDO auditLogDO = OrderAuditLogDO.builder().applyId(applyDO.getId()).orderId(applyDO.getOrderId()).optType(ApplyStatusEnum.AUDIT_REFUSE.getDesc()).build();
... ... @@ -771,6 +995,15 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
771 995 OrderLockFieldVO lockFieldVO = JSONObject.parseObject(applyDO.getFields(), OrderLockFieldVO.class);
772 996 InvoiceFieldVO invoiceBillOrderDO = lockFieldVO.getInvoiceFieldVO();
773 997 List<Long> invoiceId = invoiceBillOrderDO.getInvoiceId();
  998 + //查询是否存在未审核的扣款单。
  999 + List<OrderFieldLockApplyDO> InvoiceDeductUrlList = list(new LambdaQueryWrapper<OrderFieldLockApplyDO>()
  1000 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  1001 + .in(OrderFieldLockApplyDO::getOrderId, invoiceId)
  1002 + .eq(OrderFieldLockApplyDO::getType, ApplyTypeEnum.INVOICE_DEDUCT_URL.getType())
  1003 + .eq(OrderFieldLockApplyDO::getStatus, ApplyStatusEnum.WAIT_AUDIT));
  1004 + if(CollectionUtils.isNotEmpty(InvoiceDeductUrlList)){
  1005 + throw new BusinessException("该Invoice存在未审批的扣款单,请先审批该对账单的扣款单!");
  1006 + }
774 1007 List<InvoiceBillOrderDO> invoiceBillOrderDOS = invoiceBillOrderService.listByIds(invoiceId);
775 1008 if(CollectionUtils.isNotEmpty(invoiceBillOrderDOS)){
776 1009 List<InvoiceBillOrderDO> invoiceeBillOrderDOs = invoiceBillOrderDOS.stream().filter(Objects::nonNull).map(x -> {
... ... @@ -811,6 +1044,15 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
811 1044 if(CollectionUtils.isNotEmpty(producePayCheckBillInvoiceUrlList)){
812 1045 throw new BusinessException("该生产科对账单存在未审批的发票,请先审批该对账单的发票!");
813 1046 }
  1047 + //查询是否存在未审核的扣款单。
  1048 + List<OrderFieldLockApplyDO> checkDeductUrlList = list(new LambdaQueryWrapper<OrderFieldLockApplyDO>()
  1049 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  1050 + .in(OrderFieldLockApplyDO::getOrderId, producePaymentCheckBillId)
  1051 + .eq(OrderFieldLockApplyDO::getType, ApplyTypeEnum.CHECK_DEDUCT_URL.getType())
  1052 + .eq(OrderFieldLockApplyDO::getStatus, ApplyStatusEnum.WAIT_AUDIT));
  1053 + if(CollectionUtils.isNotEmpty(checkDeductUrlList)){
  1054 + throw new BusinessException("该生产科对账单存在未审批的扣款单,请先审批该对账单的扣款单!");
  1055 + }
814 1056 List<ProducePaymentCheckBillOrderDO> checkBillOrderDOS = checkBillOrderService.listByIds(producePaymentCheckBillId);
815 1057 if(CollectionUtils.isNotEmpty(checkBillOrderDOS)){
816 1058 List<ProducePaymentCheckBillOrderDO> producePaymentCheckBillOrderDOS = checkBillOrderDOS.stream().filter(Objects::nonNull).map(x -> {
... ... @@ -866,6 +1108,64 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
866 1108 InvoiceAndCheckBillSendEmailVO invoiceAndCheckBillSendEmailVO = new InvoiceAndCheckBillSendEmailVO();
867 1109 invoiceAndCheckBillSendEmailVO.setCheckBillOrderDO(invoiceInfoDO);
868 1110 emailSendUtils.sendInvoiceAndCheckEmail(FinanceOverEnum.CHECK_INVOICEURL_PASS,invoiceAndCheckBillSendEmailVO,true);
  1111 + }else if(ApplyTypeEnum.INVOICE_DEDUCT_URL.getType().equals(applyDO.getType())){
  1112 + applyDO.setAuditUserId(auditUserId);
  1113 + applyDO.setStatus(ApplyStatusEnum.AUDIT_PASS.getStatus());
  1114 + OrderLockFieldVO lockFieldVO = JSONObject.parseObject(applyDO.getFields(), OrderLockFieldVO.class);
  1115 + DeductionUrlFieldVO deductionUrlFieldVO = lockFieldVO.getDeductionUrlFieldVO();
  1116 + //查询旧的。
  1117 + InvoiceBillOrderDO invoiceBillOrderDO = invoiceBillOrderService.getById(deductionUrlFieldVO.getId());
  1118 + invoiceBillOrderDO.setInvoiceDeductUrlStatus(ApplyStatusEnum.AUDIT_PASS.getStatus());
  1119 + //传递给审核一直都是最新的发票。
  1120 + if(com.order.erp.common.utils.StringUtils.isNotBlank(invoiceBillOrderDO.getDeductUrl())){
  1121 + if(com.order.erp.common.utils.StringUtils.isNotBlank(deductionUrlFieldVO.getDeductUrl())){
  1122 + Set<String> deductUrlSet = new HashSet<>(Arrays.asList(
  1123 + org.apache.commons.lang3.StringUtils.defaultString(invoiceBillOrderDO.getDeductUrl()).split(",")));
  1124 + if(!deductUrlSet.contains(deductionUrlFieldVO.getDeductUrl())){
  1125 + deductUrlSet.add(deductionUrlFieldVO.getDeductUrl());
  1126 + String updateDeductUrl=String.join(",",deductUrlSet);
  1127 + invoiceBillOrderDO.setDeductUrl(updateDeductUrl);
  1128 + }
  1129 + }
  1130 + }else{
  1131 + if(com.order.erp.common.utils.StringUtils.isNotBlank(deductionUrlFieldVO.getDeductUrl())){
  1132 + invoiceBillOrderDO.setDeductUrl(deductionUrlFieldVO.getDeductUrl());
  1133 + }
  1134 + }
  1135 + invoiceBillOrderService.updateById(invoiceBillOrderDO);
  1136 + //发送邮件通知跟单员和业务员以及财务。
  1137 + InvoiceAndCheckBillSendEmailVO invoiceAndCheckBillSendEmailVO = new InvoiceAndCheckBillSendEmailVO();
  1138 + invoiceAndCheckBillSendEmailVO.setDeductionUrlFieldVO(deductionUrlFieldVO);
  1139 + emailSendUtils.sendInvoiceAndCheckEmail(FinanceOverEnum.INVOICE_DEDUCTURL_PASS,invoiceAndCheckBillSendEmailVO,true);
  1140 + }else if(ApplyTypeEnum.CHECK_DEDUCT_URL.getType().equals(applyDO.getType())){
  1141 + applyDO.setAuditUserId(auditUserId);
  1142 + applyDO.setStatus(ApplyStatusEnum.AUDIT_PASS.getStatus());
  1143 + OrderLockFieldVO lockFieldVO = JSONObject.parseObject(applyDO.getFields(), OrderLockFieldVO.class);
  1144 + DeductionUrlFieldVO deductionUrlFieldVO = lockFieldVO.getDeductionUrlFieldVO();
  1145 + //查询旧的。
  1146 + ProducePaymentCheckBillOrderDO checkBillOrderDO= checkBillOrderService.getById(deductionUrlFieldVO.getId());
  1147 + checkBillOrderDO.setCheckDeductUrlStatus(ApplyStatusEnum.AUDIT_PASS.getStatus());
  1148 + //传递给审核一直都是最新的发票。
  1149 + if(com.order.erp.common.utils.StringUtils.isNotBlank(checkBillOrderDO.getDeductUrl())){
  1150 + if(com.order.erp.common.utils.StringUtils.isNotBlank(deductionUrlFieldVO.getDeductUrl())){
  1151 + Set<String> deductUrlSet = new HashSet<>(Arrays.asList(
  1152 + org.apache.commons.lang3.StringUtils.defaultString(checkBillOrderDO.getDeductUrl()).split(",")));
  1153 + if(!deductUrlSet.contains(deductionUrlFieldVO.getDeductUrl())){
  1154 + deductUrlSet.add(deductionUrlFieldVO.getDeductUrl());
  1155 + String updateDeductUrl=String.join(",",deductUrlSet);
  1156 + checkBillOrderDO.setDeductUrl(updateDeductUrl);
  1157 + }
  1158 + }
  1159 + }else{
  1160 + if(com.order.erp.common.utils.StringUtils.isNotBlank(deductionUrlFieldVO.getDeductUrl())){
  1161 + checkBillOrderDO.setDeductUrl(deductionUrlFieldVO.getDeductUrl());
  1162 + }
  1163 + }
  1164 + checkBillOrderService.updateById(checkBillOrderDO);
  1165 + //发送邮件通知跟单员和业务员以及财务。
  1166 + InvoiceAndCheckBillSendEmailVO invoiceAndCheckBillSendEmailVO = new InvoiceAndCheckBillSendEmailVO();
  1167 + invoiceAndCheckBillSendEmailVO.setDeductionUrlFieldVO(deductionUrlFieldVO);
  1168 + emailSendUtils.sendInvoiceAndCheckEmail(FinanceOverEnum.CHECK_DEDUCTURL_PASS,invoiceAndCheckBillSendEmailVO,true);
869 1169 }
870 1170  
871 1171 OrderAuditLogDO auditLogDO = OrderAuditLogDO.builder().applyId(applyDO.getId()).orderId(applyDO.getOrderId()).optType(ApplyStatusEnum.AUDIT_PASS.getDesc()).build();
... ...
src/main/java/com/order/erp/service/order/impl/ProducePaymentCheckBillOrderServiceImpl.java
... ... @@ -14,10 +14,7 @@ import com.order.erp.common.constant.Constant;
14 14 import com.order.erp.common.constant.ServerResult;
15 15 import com.order.erp.common.constant.ServerResultCode;
16 16 import com.order.erp.common.exception.BusinessException;
17   -import com.order.erp.common.utils.DateUtils;
18   -import com.order.erp.common.utils.EmailSendUtils;
19   -import com.order.erp.common.utils.StringUtils;
20   -import com.order.erp.common.utils.TransactionHelper;
  17 +import com.order.erp.common.utils.*;
21 18 import com.order.erp.config.DataScope;
22 19 import com.order.erp.domain.*;
23 20 import com.order.erp.domain.dto.BaseDO;
... ... @@ -33,6 +30,7 @@ import org.apache.poi.ss.usermodel.*;
33 30 import org.apache.poi.ss.util.CellRangeAddress;
34 31 import org.apache.poi.util.IOUtils;
35 32 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  33 +import org.joda.time.DateTime;
36 34 import org.springframework.beans.BeanUtils;
37 35 import org.springframework.stereotype.Service;
38 36  
... ... @@ -51,7 +49,7 @@ import java.util.stream.Collectors;
51 49 import java.util.stream.Stream;
52 50  
53 51 /**
54   - * 生产科对账单应账单(ProducePaymentCheckBillOrder)表服务实现类
  52 + * 生产科对账单应账单(ProducePaymentCheckBillOrder)表服务实现类
55 53 *
56 54 * @author makejava
57 55 * @since 2024-08-05 16:26:35
... ... @@ -818,7 +816,6 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
818 816 .orderId(x.getId())
819 817 .payedDate(createVO.getPayedDate())
820 818 .status(FinanceEnum.UNPAID_PAYMENTS.getStatus())
821   - .finishStatus(FinanceEnum.UNPAID_PAYMENTS.getStatus())
822 819 .productionName(x.getProductionDepartment())
823 820 .businesPerson(x.getBusinessPerson())
824 821 .trackerUser(x.getCreateBy())
... ... @@ -898,6 +895,7 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
898 895 */
899 896 @Override
900 897 public ServerResult updateDeductInfo(ProducePaymentCheckBillDeductInfoVO deductInfoVO) {
  898 + Long loginUserId = dataScope.getLoginUserId();
901 899 if (Objects.isNull(deductInfoVO.getId())) {
902 900 throw new BusinessException("id 不能为空");
903 901 }
... ... @@ -905,13 +903,57 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
905 903 if (Objects.isNull(checkBillOrderDO)) {
906 904 throw new BusinessException("应付款单据不存在");
907 905 }
908   - if(Objects.nonNull(checkBillOrderDO.getStatus()) && FinanceEnum.RECEIVED_PAYMENT.getStatus()==checkBillOrderDO.getStatus()){
  906 + if(Objects.nonNull(checkBillOrderDO.getStatus()) && ((FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(checkBillOrderDO.getStatus())) ||
  907 + (FinanceEnum.OK_PAYMENT.getStatus().equals(checkBillOrderDO.getStatus())))){
909 908 throw new BusinessException("应付款单据已审核通过,无法编辑");
910 909 }
911 910 //todo 已完成。
912 911 // checkCommitApply(deductInfoVO.getId());
913 912 checkApply(new ArrayList<>(Arrays.asList(deductInfoVO.getId())));
914   - //需要判断一下是否为空?不然知己以逗号分隔会报错。
  913 + //对扣款单进行审批。
  914 + checkCommitDeductionUrlApply(checkBillOrderDO.getId());
  915 + OrderLockFieldVO orderLockFieldVO = new OrderLockFieldVO();
  916 + DeductionUrlFieldVO deductionUrlFieldVO = new DeductionUrlFieldVO();
  917 + checkBillOrderDO.setDeductAmount((deductInfoVO.getDeductAmount()==null? BigDecimal.ZERO:deductInfoVO.getDeductAmount()).setScale(2, BigDecimal.ROUND_HALF_UP));
  918 + checkBillOrderDO.setActualPayedAmount((checkBillOrderDO.getTotalProductionAmount().subtract(deductInfoVO.getDeductAmount()==null? BigDecimal.ZERO:deductInfoVO.getDeductAmount())).setScale(2, BigDecimal.ROUND_HALF_UP));
  919 + checkBillOrderDO.setUnPayedAmount((checkBillOrderDO.getTotalProductionAmount().subtract(checkBillOrderDO.getDeductAmount()).subtract(checkBillOrderDO.getTotalActualPayedAmount())).setScale(2, BigDecimal.ROUND_HALF_UP));
  920 + if(StringUtils.isNotBlank(deductInfoVO.getDeductUrl())){
  921 + checkBillOrderDO.setCheckDeductUrlStatus(ApplyStatusEnum.WAIT_AUDIT.getStatus());
  922 + }
  923 + updateById(checkBillOrderDO);
  924 + if(StringUtils.isNotBlank(deductInfoVO.getDeductUrl())){
  925 + OrderBaseInfoDO orderBaseInfoDO = orderBaseInfoService.getById(checkBillOrderDO.getOrderId());
  926 + //以后对于文件类型,只存文件名,通过bucket每次实时访问。以前是设置过期时间很长,永久存在数据库中。
  927 + String urlFileName = SplitUrlGetBucketName.getUrlFileName(deductInfoVO.getDeductUrl());
  928 + //不保存,仅仅只是做一个审核,千万不要保存。目的是传递给审核最新的扣款单,审核通过后才保存,不通过则不保存。
  929 + checkBillOrderDO.setDeductUrl(urlFileName);
  930 + deductionUrlFieldVO.setCheckNo(checkBillOrderDO.getCheckNo());
  931 + if(Objects.nonNull(orderBaseInfoDO)){
  932 + deductionUrlFieldVO.setInnerNo(orderBaseInfoDO.getInnerNo());
  933 + }
  934 + deductionUrlFieldVO.setId(checkBillOrderDO.getId());
  935 + deductionUrlFieldVO.setBusinesPerson(checkBillOrderDO.getBusinesPerson());
  936 + deductionUrlFieldVO.setTrackerUser(checkBillOrderDO.getTrackerUser());
  937 + deductionUrlFieldVO.setFinancePerson(checkBillOrderDO.getFinancePerson());
  938 + deductionUrlFieldVO.setDeductUrl(urlFileName);
  939 + deductionUrlFieldVO.setProductionName(orderBaseInfoDO.getProductionDepartment());
  940 + orderLockFieldVO.setDeductionUrlFieldVO(deductionUrlFieldVO);
  941 + deductionUrlFieldVO.setDeductAmount(deductInfoVO.getDeductAmount());
  942 + OrderFieldLockApplyDO applyDO = OrderFieldLockApplyDO.builder()
  943 + .applyUserId(loginUserId)
  944 + .auditUserId(null)
  945 + .fields(JSONObject.toJSONString(orderLockFieldVO))
  946 + .orderId(checkBillOrderDO.getId())
  947 + .type(ApplyTypeEnum.CHECK_DEDUCT_URL.getType())
  948 + .remark(ApplyTypeEnum.CHECK_DEDUCT_URL.getDesc())
  949 + .status(ApplyStatusEnum.WAIT_AUDIT.getStatus())
  950 + .auditRoleCodes(RoleEnum.ADMIN.getCode() + Constant.COMMA_CHARACTER + RoleEnum.FINANCE_USER.getCode())
  951 + .build();
  952 + orderFieldLockApplyService.save(applyDO);
  953 + }
  954 + return ServerResult.success();
  955 +
  956 + /*//需要判断一下是否为空?不然知己以逗号分隔会报错。
915 957 if(StringUtils.isNotBlank(checkBillOrderDO.getDeductUrl())){
916 958 //记住:需要修改数据表对应的字段deduct_url的varchar数据范围,修改为1000左右。
917 959 if(StringUtils.isNotBlank(deductInfoVO.getDeductUrl())){
... ... @@ -934,7 +976,7 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
934 976 checkBillOrderDO.setActualPayedAmount((checkBillOrderDO.getTotalProductionAmount().subtract(deductInfoVO.getDeductAmount()==null? BigDecimal.ZERO:deductInfoVO.getDeductAmount())).setScale(2, BigDecimal.ROUND_HALF_UP));
935 977 checkBillOrderDO.setUnPayedAmount((checkBillOrderDO.getTotalProductionAmount().subtract(checkBillOrderDO.getDeductAmount()).subtract(checkBillOrderDO.getTotalActualPayedAmount())).setScale(2, BigDecimal.ROUND_HALF_UP));
936 978 updateById(checkBillOrderDO);
937   - return ServerResult.success();
  979 + return ServerResult.success();*/
938 980 }
939 981  
940 982 /**
... ... @@ -952,8 +994,9 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
952 994 if (Objects.isNull(checkBillOrderDO)) {
953 995 throw new BusinessException("应付款单据不存在");
954 996 }
955   - if(Objects.nonNull(checkBillOrderDO.getStatus()) && FinanceEnum.RECEIVED_PAYMENT.getStatus()==checkBillOrderDO.getStatus()){
956   - throw new BusinessException("已完成付款,无法更新!");
  997 + if(Objects.nonNull(checkBillOrderDO.getStatus()) && ((FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(checkBillOrderDO.getStatus())) ||
  998 + (FinanceEnum.OK_PAYMENT.getStatus().equals(checkBillOrderDO.getStatus())))){
  999 + throw new BusinessException("应付款单据已审核通过,无法编辑");
957 1000 }
958 1001 //todo 已完成。
959 1002 // checkCommitApply(amountInfoVO.getId());
... ... @@ -980,8 +1023,9 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
980 1023 if(Objects.isNull(checkBillOrderDO)){
981 1024 return ServerResult.fail("生产科对账单号不存在!");
982 1025 }
983   - if(FinanceEnum.RECEIVED_PAYMENT.getStatus()==checkBillOrderDO.getStatus()){
984   - throw new BusinessException("该订单已通过审核无法继续上传发票!");
  1026 + if(Objects.nonNull(checkBillOrderDO.getStatus()) && ((FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(checkBillOrderDO.getStatus())) ||
  1027 + (FinanceEnum.OK_PAYMENT.getStatus().equals(checkBillOrderDO.getStatus())))){
  1028 + throw new BusinessException("应付款单据已审核通过,无法编辑");
985 1029 }
986 1030 if(StringUtils.isBlank(invoiceInfoVO.getInvoiceUrl())){
987 1031 return ServerResult.success();
... ... @@ -998,7 +1042,7 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
998 1042 checkBillOrderDO.setDepartmentInvoiceStatus(ApplyStatusEnum.WAIT_AUDIT.getStatus());
999 1043 updateById(checkBillOrderDO);
1000 1044 //不保存,仅仅只是做一个审核,千万不要保存。目的是传递给审核的是最新的发票,审核通过才保存,不通过则不保存。
1001   - checkBillOrderDO.setInvoiceUrl(invoiceInfoVO.getInvoiceUrl());
  1045 + checkBillOrderDO.setInvoiceUrl(SplitUrlGetBucketName.getUrlFileName(invoiceInfoVO.getInvoiceUrl()));
1002 1046 //复制到producePaymentCheckBillVO。
1003 1047 BeanUtils.copyProperties(checkBillOrderDO,producePaymentCheckBillVO);
1004 1048 producePaymentCheckBillVO.setInnerNo(orderBaseInfoDO.getInnerNo());
... ... @@ -1036,7 +1080,8 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
1036 1080 if(!isTure){
1037 1081 throw new BusinessException("勾选订单生产科需一致");
1038 1082 }
1039   - boolean anyMatch = producePaymentCheckBillOrderDOList.stream().filter(Objects::nonNull).anyMatch(producePaymentCheckBillOrderDO -> FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(producePaymentCheckBillOrderDO.getStatus()));
  1083 + boolean anyMatch = producePaymentCheckBillOrderDOList.stream().filter(Objects::nonNull).anyMatch(producePaymentCheckBillOrderDO -> ((FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(producePaymentCheckBillOrderDO.getStatus())))
  1084 + || (FinanceEnum.OK_PAYMENT.getStatus().equals(producePaymentCheckBillOrderDO.getStatus())));
1040 1085 if(anyMatch){
1041 1086 throw new BusinessException("订单中包含已付款的数据,无法提交!");
1042 1087 }
... ... @@ -1110,6 +1155,20 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
1110 1155 }
1111 1156  
1112 1157 /**
  1158 + * @param id
  1159 + *
  1160 + */
  1161 + private void checkCommitDeductionUrlApply(Long id){
  1162 + List<OrderFieldLockApplyDO> orderFieldLockApplyDOList = orderFieldLockApplyService.list(new LambdaQueryWrapper<OrderFieldLockApplyDO>()
  1163 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  1164 + .eq(OrderFieldLockApplyDO::getType, ApplyTypeEnum.CHECK_DEDUCT_URL.getType())
  1165 + .eq(OrderFieldLockApplyDO::getStatus, ApplyStatusEnum.WAIT_AUDIT.getStatus())
  1166 + .eq(OrderFieldLockApplyDO::getOrderId, id));
  1167 + if(CollectionUtils.isNotEmpty(orderFieldLockApplyDOList)){
  1168 + throw new BusinessException("存在未审核的扣款单,请联系财务审批上一张扣款单再上传");
  1169 + }
  1170 + }
  1171 + /**
1113 1172 * @param producePaymentCheckBillFieldVO
1114 1173 * @param userId
1115 1174 * @return
... ... @@ -1231,7 +1290,8 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
1231 1290 if(!isTrue){
1232 1291 throw new BusinessException("勾选订单的checkNo需一致");
1233 1292 }
1234   - boolean anyPaid = checkBillOrderDOS.stream().anyMatch(checkBillOrderDO -> FinanceEnum.RECEIVED_PAYMENT.getStatus() == checkBillOrderDO.getStatus());
  1293 + boolean anyPaid = checkBillOrderDOS.stream().anyMatch(checkBillOrderDO ->((FinanceEnum. RECEIVED_PAYMENT.getStatus().equals(checkBillOrderDO.getStatus())))
  1294 + || (FinanceEnum.OK_PAYMENT.getStatus().equals(checkBillOrderDO.getStatus())));
1235 1295 if(anyPaid) {
1236 1296 throw new BusinessException("包含已付款的订单,无法删除!");
1237 1297 }
... ... @@ -1273,10 +1333,11 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
1273 1333 //获取每一个url的文件名称
1274 1334 Arrays.stream(checkBillOrderDO.getDeductUrl().split(",")).forEach(x->{
1275 1335 try{
1276   - String preUrl = x.contains("?") ? x.split("\\?")[0] : x;
1277   - String fileName = preUrl.substring(preUrl.lastIndexOf("/") + 1);
  1336 +// String preUrl = x.contains("?") ? x.split("\\?")[0] : x;
  1337 + String fileName = x.substring(x.lastIndexOf("/") + 1);
1278 1338 String decodeUrl = URLDecoder.decode(fileName, StandardCharsets.UTF_8.name());
1279   - hashMap.put(decodeUrl,x);
  1339 + String url = AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(x), decodeUrl, new DateTime().plusMinutes(Constant.TWO).toDate());
  1340 + hashMap.put(decodeUrl,url);
1280 1341 }catch(Exception e){
1281 1342 throw new BusinessException("文件名错误!");
1282 1343 }
... ... @@ -1304,10 +1365,11 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
1304 1365 //获取每一个url的文件名称
1305 1366 Arrays.stream(checkBillOrderDO.getInvoiceUrl().split(",")).forEach(x->{
1306 1367 try{
1307   - String preUrl = x.contains("?") ? x.split("\\?")[0] : x;
1308   - String fileName = preUrl.substring(preUrl.lastIndexOf("/") + 1);
  1368 +// String preUrl = x.contains("?") ? x.split("\\?")[0] : x;
  1369 + String fileName = x.substring(x.lastIndexOf("/") + 1);
1309 1370 String decodeUrl = URLDecoder.decode(fileName, StandardCharsets.UTF_8.name());
1310   - hashMap.put(decodeUrl,x);
  1371 + String url = AliOssUtil.createUrl(SplitUrlGetBucketName.getBucket(x), decodeUrl, new DateTime().plusMinutes(Constant.TWO).toDate());
  1372 + hashMap.put(decodeUrl,url);
1311 1373 }catch(Exception e){
1312 1374 throw new BusinessException("文件名错误!");
1313 1375 }
... ... @@ -1328,8 +1390,9 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
1328 1390 if(Objects.isNull(checkBillOrderDO)){
1329 1391 throw new BusinessException("生产科对账单不存在!");
1330 1392 }
1331   - if(FinanceEnum.RECEIVED_PAYMENT.getStatus()==checkBillOrderDO.getStatus()){
1332   - throw new BusinessException("已完成付款,无法修改!");
  1393 + if(Objects.nonNull(checkBillOrderDO.getStatus()) && ((FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(checkBillOrderDO.getStatus())) ||
  1394 + (FinanceEnum.OK_PAYMENT.getStatus().equals(checkBillOrderDO.getStatus())))){
  1395 + throw new BusinessException("生产科对账单据已审核通过,无法编辑");
1333 1396 }
1334 1397 //todo 要审核判断一下,判断是否处于审核状态。 已完成。
1335 1398 checkApply(new ArrayList<>(Arrays.asList(createVO.getId())));
... ... @@ -1363,8 +1426,9 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
1363 1426 throw new BusinessException("生产科对账单不存在!");
1364 1427 }
1365 1428 checkApply(new ArrayList<>(Arrays.asList(deleteVo.getId())));
1366   - if(FinanceEnum.RECEIVED_PAYMENT.getStatus()==producePaymentCheckBillOrderDO.getStatus()){
1367   - throw new BusinessException("已完成付款,无法修改!");
  1429 + if(Objects.nonNull(producePaymentCheckBillOrderDO.getStatus()) && ((FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(producePaymentCheckBillOrderDO.getStatus())) ||
  1430 + (FinanceEnum.OK_PAYMENT.getStatus().equals(producePaymentCheckBillOrderDO.getStatus())))){
  1431 + throw new BusinessException("生产科对账单已审核通过,无法编辑");
1368 1432 }
1369 1433 producePaymentCheckBillOrderDO.setDeductUrl("");
1370 1434 updateById(producePaymentCheckBillOrderDO);
... ... @@ -1373,20 +1437,32 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl&lt;Produce
1373 1437  
1374 1438 @Override
1375 1439 public ServerResult isFinishStatus(ProducePaymentCheckBillInvoiceInfoVO producePaymentCheckBillInvoiceInfoVO) {
  1440 + if(Objects.isNull(producePaymentCheckBillInvoiceInfoVO.getId())){
  1441 + throw new BusinessException(ServerResultCode.PARAM_ERROR);
  1442 + }
1376 1443 ProducePaymentCheckBillOrderDO producePaymentCheckBillOrderDO = getById(producePaymentCheckBillInvoiceInfoVO.getId());
1377 1444 if(Objects.nonNull(producePaymentCheckBillOrderDO)){
1378   - if(!FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(producePaymentCheckBillOrderDO.getStatus())){
1379   - throw new BusinessException("该订单还没有完成最终付款,无法设置最终状态为已完成!");
  1445 + if((!FinanceEnum.RECEIVED_PAYMENT.getStatus().equals(producePaymentCheckBillOrderDO.getStatus())) && (!FinanceEnum.OK_PAYMENT.getStatus().equals(producePaymentCheckBillOrderDO.getStatus()))){
  1446 + throw new BusinessException("该订单还没有审核通过,你无法设置最终状态为已付款!");
1380 1447 }
1381 1448 List<ProducePaymentCheckBillOrderDO> producePaymentCheckBillOrderDOList = list(new LambdaQueryWrapper<ProducePaymentCheckBillOrderDO>().eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
1382 1449 .eq(ProducePaymentCheckBillOrderDO::getStatus, FinanceEnum.RECEIVED_PAYMENT.getStatus())
1383 1450 .eq(ProducePaymentCheckBillOrderDO::getCheckNo, producePaymentCheckBillOrderDO.getCheckNo()));
1384 1451 if(CollectionUtils.isNotEmpty(producePaymentCheckBillOrderDOList)){
1385 1452 List<ProducePaymentCheckBillOrderDO> producePaymentCheckBillOrderDOS = producePaymentCheckBillOrderDOList.stream().map(x -> {
1386   - x.setFinishStatus(FinanceEnum.RECEIVED_PAYMENT.getStatus());
  1453 + x.setStatus(FinanceEnum.OK_PAYMENT.getStatus());
1387 1454 return x;
1388 1455 }).collect(Collectors.toList());
1389   - updateBatchById(producePaymentCheckBillOrderDOS);
  1456 + List<Long> orderIds = producePaymentCheckBillOrderDOList.stream().map(ProducePaymentCheckBillOrderDO::getOrderId).collect(Collectors.toList());
  1457 + List<OrderBaseInfoDO> orderBaseInfoDOList = orderBaseInfoService.listByIds(orderIds);
  1458 + List<OrderBaseInfoDO> orderBaseInfoDOS = orderBaseInfoDOList.stream().map(order -> {
  1459 + order.setCheckStatus(FinanceEnum.OK_PAYMENT.getStatus());
  1460 + return order;
  1461 + }).collect(Collectors.toList());
  1462 + transactionHelper.run(() ->{
  1463 + updateBatchById(producePaymentCheckBillOrderDOS);
  1464 + orderBaseInfoService.updateBatchById(orderBaseInfoDOS);
  1465 + });
1390 1466 }
1391 1467 }
1392 1468 return ServerResult.success();
... ...
src/main/resources/application-pre-prod.yml
... ... @@ -59,7 +59,7 @@ spring:
59 59 testOnReturn: true
60 60 password: eJ8(bD6]wN6=gI5=
61 61 time-between-eviction-runs-millis: 1000
62   - url: jdbc:mysql://47.104.8.35:3307/order-erp-test-real?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&allowMultiQueries=true&useAffectedRows=true&autoReconnectForPools=true
  62 + url: jdbc:mysql://47.104.8.35:3307/order-erp?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&allowMultiQueries=true&useAffectedRows=true&autoReconnectForPools=true
63 63 username: root
64 64 redis:
65 65 database: 10
... ... @@ -71,7 +71,7 @@ spring:
71 71 max-wait: -1
72 72 min-idle: 3
73 73 time-between-eviction-runs: 100
74   - password: ''
  74 + password: 445042a788dd
75 75 port: 6380
76 76 timeout: 2000
77 77 mail:
... ... @@ -176,8 +176,8 @@ file:
176 176 # 阿里pss图片服务
177 177 oss:
178 178 endpoint: https://oss-cn-qingdao.aliyuncs.com
179   - accessKeyId: LTAI5t7u1gXR2vm82sd6CkVz
180   - accessKeySecret: m4NzHZZsZiauKmRO8y7DihmcGNdQk4
  179 + accessKeyId: LTAI5tHKVvrz1xxExYD7E3mo
  180 + accessKeySecret: q0m2RjNuzL4GGlUhK3P9qc2R0hZvIh
181 181 bucket: test-alterego
182 182  
183 183  
... ...
src/main/resources/application-prod.yml
... ... @@ -80,7 +80,8 @@ spring:
80 80 # 发送者邮箱,已开通POP3/SMTP服务的邮箱,也就是你自己的
81 81 username: information@alterego.xin
82 82 # 配置密码,注意不是真正的密码,而是刚刚申请到的授权码
83   - password: AlterEgo1608ITf31
  83 +# password: AlterEgo1608ITf31
  84 + password: Y7AvfSJ1bcjYWXqF
84 85 # 邮件接收者
85 86 mailRecipient: #邮件接收者邮箱
86 87 # 端口号465或587(QQ邮箱发送邮件仅支持587端口协议)
... ... @@ -174,8 +175,8 @@ file:
174 175 # 阿里pss图片服务
175 176 oss:
176 177 endpoint: https://oss-cn-qingdao.aliyuncs.com
177   - accessKeyId: LTAI5t7u1gXR2vm82sd6CkVz
178   - accessKeySecret: m4NzHZZsZiauKmRO8y7DihmcGNdQk4
  178 + accessKeyId: LTAI5tHKVvrz1xxExYD7E3mo
  179 + accessKeySecret: q0m2RjNuzL4GGlUhK3P9qc2R0hZvIh
179 180 bucket: alterego
180 181  
181 182  
... ...
src/main/resources/application-test.yml
... ... @@ -175,8 +175,8 @@ file:
175 175 # 阿里pss图片服务
176 176 oss:
177 177 endpoint: https://oss-cn-qingdao.aliyuncs.com
178   - accessKeyId: LTAI5t7u1gXR2vm82sd6CkVz
179   - accessKeySecret: m4NzHZZsZiauKmRO8y7DihmcGNdQk4
  178 + accessKeyId: LTAI5tHKVvrz1xxExYD7E3mo
  179 + accessKeySecret: q0m2RjNuzL4GGlUhK3P9qc2R0hZvIh
180 180 bucket: test-alterego
181 181  
182 182  
... ...
src/main/resources/mapper/InvoiceBillOrderMapper.xml
... ... @@ -98,7 +98,7 @@
98 98 i.status AS invoiceStatus, -- invoice状态
99 99 i.deduct_amount AS invoiceDeductAmount, -- 扣款金额
100 100 i.notes AS invoiceNotes, -- invoice备注
101   - i.finish_status AS invoiceFinishStatus,
  101 + i.invoice_deduct_url_status AS invoiceDeductUrlStatus,
102 102 -- 生产科付款信息
103 103 p.id AS checkId,
104 104 p.check_no AS checkNo, -- checkNo编号
... ... @@ -115,7 +115,7 @@
115 115 p.deduct_url AS checkDeductUrl, -- 扣款单
116 116 p.notes AS checkNotes, -- checkNo备注
117 117 p.invoice_url AS checkInvoiceUrl, -- 发票
118   - p.finish_status AS checkFinishStatus
  118 + p.check_deduct_url_status AS checkDeductUrlStatus
119 119 FROM order_base_info o
120 120 LEFT JOIN invoice_bill_order AS i
121 121 ON o.id = i.order_id AND i.enable_flag = 10
... ... @@ -136,12 +136,6 @@
136 136 <if test="queryVO.checkNoStatus != null">
137 137 AND o.check_status = #{queryVO.checkNoStatus}
138 138 </if>
139   - <if test="queryVO.invoiceFinishStatus != null">
140   - AND i.finish_status = #{queryVO.invoiceFinishStatus}
141   - </if>
142   - <if test="queryVO.checkFinishStatus != null">
143   - AND p.finish_status = #{queryVO.checkFinishStatus}
144   - </if>
145 139 <if test="queryVO.customerCode != null and queryVO.customerCode.size > 0 ">
146 140 AND o.customer_code IN
147 141 <foreach collection="queryVO.customerCode" item="customerCode" open="(" separator="," close=")">
... ... @@ -235,12 +229,6 @@
235 229 <if test="queryVO.checkNoStatus != null">
236 230 AND o.check_status = #{queryVO.checkNoStatus}
237 231 </if>
238   - <if test="queryVO.invoiceFinishStatus != null">
239   - AND i.finish_status = #{queryVO.invoiceFinishStatus}
240   - </if>
241   - <if test="queryVO.checkFinishStatus != null">
242   - AND p.finish_status = #{queryVO.checkFinishStatus}
243   - </if>
244 232 <if test="queryVO.customerCode != null and queryVO.customerCode.size > 0 ">
245 233 AND o.customer_code IN
246 234 <foreach collection="queryVO.customerCode" item="customerCode" open="(" separator="," close=")">
... ...
src/main/resources/mapper/OrderBaseInfoMapper.xml
... ... @@ -133,4 +133,83 @@
133 133 opa.mid_check_result IS NULL)
134 134 </select>
135 135  
  136 + <select id="countRecentYearByOrderInit" resultType="java.lang.Long">
  137 + SELECT COUNT(*)
  138 + FROM (SELECT project_no, inner_no
  139 + FROM order_base_info
  140 + WHERE enable_flag = 10
  141 + AND (return_order != '1' OR return_order IS NULL)
  142 + GROUP BY project_no, inner_no) AS unique_combinations;
  143 + </select>
  144 +
  145 + <select id="countRecentMonthValueByOrderInit" resultType="java.lang.Long">
  146 + SELECT COUNT(*)
  147 + FROM (
  148 + SELECT project_no, inner_no
  149 + FROM order_base_info
  150 + WHERE enable_flag = 10
  151 + AND (return_order != '1' OR return_order IS NULL) -- 处理 NULL 值
  152 + AND inner_no LIKE CONCAT('_____', #{dataYear}, '%') -- 直接匹配年份
  153 + GROUP BY project_no, inner_no
  154 + ) AS unique_combinations;
  155 +
  156 + </select>
  157 +
  158 + <select id="countRecentDayByOrderInit" resultType="java.lang.Long">
  159 + SELECT COUNT(*)
  160 + FROM (
  161 + SELECT project_no, inner_no
  162 + FROM order_base_info
  163 + WHERE enable_flag = 10
  164 + AND (return_order != '1' OR return_order IS NULL)
  165 + AND create_time >= #{startDate}
  166 + AND create_time <![CDATA[ < ]]> #{endDate}
  167 + AND inner_no LIKE CONCAT('_____', #{year}, '%')
  168 + GROUP BY project_no, inner_no
  169 + ) AS unique_combinations;
  170 +
  171 + </select>
  172 +
  173 + <select id="countAllYearByOrderStatus" resultType="java.lang.Long">
  174 + SELECT COUNT(*)
  175 + FROM (
  176 + SELECT project_no, inner_no
  177 + FROM order_base_info
  178 + WHERE enable_flag = 10
  179 + AND (return_order != '1' OR return_order IS NULL)
  180 + AND order_status=#{orderStatus}
  181 + GROUP BY project_no, inner_no
  182 + ) AS unique_combinations;
  183 +
  184 + </select>
  185 +
  186 + <select id="countAllMonthByOrderStatus" resultType="java.lang.Long">
  187 + SELECT COUNT(*)
  188 + FROM (
  189 + SELECT project_no, inner_no
  190 + FROM order_base_info
  191 + WHERE enable_flag = 10
  192 + AND (return_order != '1' OR return_order IS NULL)
  193 + AND order_status=#{orderStatus}
  194 + AND inner_no LIKE CONCAT('_____', #{dataYear}, '%') -- 直接匹配年份
  195 + GROUP BY project_no, inner_no
  196 + ) AS unique_combinations;
  197 +
  198 + </select>
  199 +
  200 + <select id="countAllDayvalueByOrderStatus" resultType="java.lang.Long">
  201 + SELECT COUNT(*)
  202 + FROM (
  203 + SELECT project_no, inner_no
  204 + FROM order_base_info
  205 + WHERE enable_flag = 10
  206 + AND (return_order != '1' OR return_order IS NULL)
  207 + AND create_time >= #{startDate}
  208 + AND create_time <![CDATA[ < ]]> #{endDate}
  209 + AND order_status=#{orderStatus}
  210 + AND inner_no LIKE CONCAT('_____', #{year}, '%')
  211 + GROUP BY project_no, inner_no
  212 + ) AS unique_combinations;
  213 +
  214 + </select>
136 215 </mapper>
... ...