Commit ca29250634c4ffc343ce4282ddc22f11f81ba10e

Authored by chenhang4442024
1 parent 5d08aa73

更新邮件模块,解决尾期验货日期发送邮件到对应生产科

src/main/java/com/order/erp/common/constant/Constant.java
@@ -329,5 +329,9 @@ public class Constant { @@ -329,5 +329,9 @@ public class Constant {
329 * 缓存导入excel错误信息 redis key 329 * 缓存导入excel错误信息 redis key
330 */ 330 */
331 public static final String EXCEL_IMPORT_ERROR_PREFIX = "excel:import:error:"; 331 public static final String EXCEL_IMPORT_ERROR_PREFIX = "excel:import:error:";
  332 + /**
  333 + * redis过期时间。
  334 + */
  335 + public static final long REDIS_EMAIL_TIME = 90;
332 336
333 } 337 }
src/main/java/com/order/erp/common/utils/EmailSendUtils.java
1 package com.order.erp.common.utils; 1 package com.order.erp.common.utils;
2 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 2 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  3 +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
  4 +import com.order.erp.common.constant.ServerResultCode;
  5 +import com.order.erp.common.exception.BusinessException;
3 import com.order.erp.domain.EmailTemplateEnum; 6 import com.order.erp.domain.EmailTemplateEnum;
4 import com.order.erp.domain.email.OrderProductEmailVO; 7 import com.order.erp.domain.email.OrderProductEmailVO;
5 import com.order.erp.domain.vo.order.OrderEventJobVO; 8 import com.order.erp.domain.vo.order.OrderEventJobVO;
@@ -28,7 +31,7 @@ import java.util.Map; @@ -28,7 +31,7 @@ import java.util.Map;
28 @Component 31 @Component
29 public class EmailSendUtils { 32 public class EmailSendUtils {
30 @Value("${spring.mail.username}") 33 @Value("${spring.mail.username}")
31 - public String sendEmail; 34 + public String sendEmail;
32 @Resource 35 @Resource
33 private JavaMailSender javaMailSender; 36 private JavaMailSender javaMailSender;
34 @Resource 37 @Resource
@@ -43,28 +46,35 @@ public class EmailSendUtils { @@ -43,28 +46,35 @@ public class EmailSendUtils {
43 * @throws IOException 46 * @throws IOException
44 */ 47 */
45 48
46 - public void sendEmail(EmailTemplateEnum emailTemplateEnum, List<String> receiveemailList, OrderEventJobVO orderEventJobVO) throws MessagingException, IOException, TemplateException {  
47 - MimeMessage mimeMessage = javaMailSender.createMimeMessage();  
48 - if(CollectionUtils.isNotEmpty(receiveemailList)){  
49 - MimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true);  
50 - //设置邮件的主题  
51 - helper.setSubject(emailTemplateEnum.getTitle());  
52 - //设置发件人  
53 - helper.setFrom(sendEmail);  
54 - //设置收件人  
55 - String[] receiveemailListArray = receiveemailList.toArray(new String[receiveemailList.size()]);  
56 - helper.setTo(receiveemailListArray);  
57 - helper.setSentDate(new Date()); 49 + public void sendEmail(EmailTemplateEnum emailTemplateEnum, List<String> receiveemailList, OrderEventJobVO orderEventJobVO) {
  50 + if(CollectionUtils.isEmpty(receiveemailList) && emailTemplateEnum ==null && ObjectUtils.isNull(orderEventJobVO)){
  51 + throw new BusinessException(ServerResultCode.PARAM_ERROR);
  52 + }
  53 + MimeMessage mimeMessage = javaMailSender.createMimeMessage();
  54 + MimeMessageHelper helper= null;
58 Map<String, Object> map = new HashMap<>(); 55 Map<String, Object> map = new HashMap<>();
59 map.put("context",emailTemplateEnum.getContent()); 56 map.put("context",emailTemplateEnum.getContent());
60 map.put("title",emailTemplateEnum.getTitle()); 57 map.put("title",emailTemplateEnum.getTitle());
61 map.put("data",orderEventJobVO); 58 map.put("data",orderEventJobVO);
62 - Template template = freeMarkerConfigurer.getConfiguration().getTemplate("mail.ftl");  
63 - StringWriter stringWriter = new StringWriter();  
64 - template.process(map,stringWriter);  
65 - helper.setText(stringWriter.toString(),true);  
66 - javaMailSender.send(mimeMessage); 59 + Template template = null;
  60 + //设置收件人
  61 + String[] receiveemailListArray = receiveemailList.toArray(new String[receiveemailList.size()]);
  62 + try {
  63 + helper = new MimeMessageHelper(mimeMessage,true);
  64 + //设置邮件的主题
  65 + helper.setSubject(emailTemplateEnum.getTitle());
  66 + //设置发件人
  67 + helper.setFrom(sendEmail);
  68 + helper.setTo(receiveemailListArray);
  69 + helper.setSentDate(new Date());
  70 + template = freeMarkerConfigurer.getConfiguration().getTemplate("mail.ftl");
  71 + StringWriter stringWriter = new StringWriter();
  72 + template.process(map,stringWriter);
  73 + helper.setText(stringWriter.toString(),true);
  74 + } catch (TemplateException | IOException | MessagingException e) {
  75 + throw new RuntimeException("邮件发送失败!");
67 } 76 }
  77 + javaMailSender.send(mimeMessage);
68 } 78 }
69 /** 79 /**
70 * @Description: 发送生产指示书邮件 80 * @Description: 发送生产指示书邮件
@@ -75,19 +85,27 @@ public class EmailSendUtils { @@ -75,19 +85,27 @@ public class EmailSendUtils {
75 * @throws IOException 85 * @throws IOException
76 */ 86 */
77 //生产指示书以附件方式发送。 87 //生产指示书以附件方式发送。
78 - public void sendEmail(EmailTemplateEnum emailTemplateEnum, List<String> receiveemailList, File pdfFile) throws MessagingException {  
79 - MimeMessage mimeMessage = javaMailSender.createMimeMessage();  
80 - MimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true);  
81 - //设置邮件的主题  
82 - helper.setSubject(emailTemplateEnum.getTitle());  
83 - //设置发件人  
84 - helper.setFrom(sendEmail);  
85 - //设置收件人  
86 - String[] receiveemailListArray = receiveemailList.toArray(new String[receiveemailList.size()]);  
87 - helper.setTo(receiveemailListArray);  
88 - helper.setSentDate(new Date());  
89 - helper.setText(emailTemplateEnum.getContent());  
90 - helper.addAttachment(pdfFile.getName(),pdfFile);  
91 - javaMailSender.send(mimeMessage);  
92 - } 88 + public void sendEmail(EmailTemplateEnum emailTemplateEnum, List<String> receiveemailList, File pdfFile) {
  89 + if (CollectionUtils.isEmpty(receiveemailList) && emailTemplateEnum == null && ObjectUtils.isNull(pdfFile)) {
  90 + throw new BusinessException(ServerResultCode.PARAM_ERROR);
  91 + }
  92 + MimeMessage mimeMessage = javaMailSender.createMimeMessage();
  93 + //设置收件人
  94 + String[] receiveemailListArray = receiveemailList.toArray(new String[receiveemailList.size()]);
  95 + MimeMessageHelper helper = null;
  96 + try {
  97 + helper = new MimeMessageHelper(mimeMessage, true);
  98 + //设置邮件的主题
  99 + helper.setSubject(emailTemplateEnum.getTitle());
  100 + //设置发件人
  101 + helper.setFrom(sendEmail);
  102 + helper.setTo(receiveemailListArray);
  103 + helper.setSentDate(new Date());
  104 + helper.setText(emailTemplateEnum.getContent());
  105 + helper.addAttachment(pdfFile.getName(), pdfFile);
  106 + } catch (MessagingException e) {
  107 + throw new RuntimeException("邮件发送失败!");
  108 + }
  109 + javaMailSender.send(mimeMessage);
  110 + }
93 } 111 }
94 \ No newline at end of file 112 \ No newline at end of file
src/main/java/com/order/erp/job/OrderOverTimeEventJob.java
@@ -8,11 +8,14 @@ import com.order.erp.common.constant.Constant; @@ -8,11 +8,14 @@ import com.order.erp.common.constant.Constant;
8 import com.order.erp.common.utils.*; 8 import com.order.erp.common.utils.*;
9 import com.order.erp.domain.EmailTemplateEnum; 9 import com.order.erp.domain.EmailTemplateEnum;
10 import com.order.erp.domain.OrderEventEnum; 10 import com.order.erp.domain.OrderEventEnum;
  11 +import com.order.erp.domain.dto.BaseDO;
  12 +import com.order.erp.domain.dto.admin.AdminUserDO;
11 import com.order.erp.domain.dto.order.OrderBaseInfoDO; 13 import com.order.erp.domain.dto.order.OrderBaseInfoDO;
12 import com.order.erp.domain.dto.order.OrderInspectionStageDO; 14 import com.order.erp.domain.dto.order.OrderInspectionStageDO;
13 import com.order.erp.domain.dto.order.OrderTrackStageDO; 15 import com.order.erp.domain.dto.order.OrderTrackStageDO;
14 import com.order.erp.domain.dto.order.ReceiveEmailMappingDO; 16 import com.order.erp.domain.dto.order.ReceiveEmailMappingDO;
15 import com.order.erp.domain.vo.order.*; 17 import com.order.erp.domain.vo.order.*;
  18 +import com.order.erp.service.admin.AdminUserService;
16 import com.order.erp.service.order.*; 19 import com.order.erp.service.order.*;
17 import freemarker.template.TemplateException; 20 import freemarker.template.TemplateException;
18 import lombok.extern.slf4j.Slf4j; 21 import lombok.extern.slf4j.Slf4j;
@@ -71,6 +74,9 @@ public class OrderOverTimeEventJob { @@ -71,6 +74,9 @@ public class OrderOverTimeEventJob {
71 @Resource 74 @Resource
72 private RedisUtils redisUtils; 75 private RedisUtils redisUtils;
73 76
  77 + @Resource
  78 + private AdminUserService adminUserService;
  79 +
74 /** 80 /**
75 * 凌晨1点执行,一天一次 81 * 凌晨1点执行,一天一次
76 */ 82 */
@@ -98,48 +104,80 @@ public class OrderOverTimeEventJob { @@ -98,48 +104,80 @@ public class OrderOverTimeEventJob {
98 * @param eventJobVOS 104 * @param eventJobVOS
99 */ 105 */
100 //发送邮件。 106 //发送邮件。
101 - private void sendEmail4OrderEvent(OrderEventEnum eventEnum, List<OrderEventJobVO> eventJobVOS) throws MessagingException, TemplateException, IOException { 107 + private void sendEmail4OrderEvent(OrderEventEnum eventEnum, List<OrderEventJobVO> eventJobVOS) {
102 108
103 - HashSet<String> strings = new HashSet<>(); 109 + HashSet<String> customerCodeList = new HashSet<>();
104 for (OrderEventJobVO orderEventJob : eventJobVOS) { 110 for (OrderEventJobVO orderEventJob : eventJobVOS) {
105 if (!redisUtils.hasKey(EmailTemplateEnum.byTemplate( 111 if (!redisUtils.hasKey(EmailTemplateEnum.byTemplate(
106 eventEnum.getTemplateId()) + Constant.CROSS_BAR_CHARACTER + orderEventJob.getBaseInfo().getId())) { 112 eventEnum.getTemplateId()) + Constant.CROSS_BAR_CHARACTER + orderEventJob.getBaseInfo().getId())) {
107 - strings.add(orderEventJob.getBaseInfo().getCustomerCode()); 113 + customerCodeList.add(orderEventJob.getBaseInfo().getCustomerCode());
108 } 114 }
109 } 115 }
110 LambdaQueryWrapper<ReceiveEmailMappingDO> queryWrapper = new LambdaQueryWrapper<>(); 116 LambdaQueryWrapper<ReceiveEmailMappingDO> queryWrapper = new LambdaQueryWrapper<>();
111 queryWrapper.eq(ReceiveEmailMappingDO::getEnableFlag, Constant.ENABLE_TEN); 117 queryWrapper.eq(ReceiveEmailMappingDO::getEnableFlag, Constant.ENABLE_TEN);
112 - if (strings == null || strings.isEmpty()) { 118 + if (CollectionUtils.isEmpty(customerCodeList)) {
113 queryWrapper.eq(ReceiveEmailMappingDO::getTypeValue, ""); 119 queryWrapper.eq(ReceiveEmailMappingDO::getTypeValue, "");
114 } else { 120 } else {
115 - queryWrapper.in(ReceiveEmailMappingDO::getTypeValue, strings); 121 + queryWrapper.in(ReceiveEmailMappingDO::getTypeValue, customerCodeList);
116 } 122 }
117 - queryWrapper.apply("JSON_CONTAINS(JSON_EXTRACT(config_infos,'$[*].event'),JSON_QUOTE({0}),'$')", eventEnum.getEvent());  
118 - List<ReceiveEmailMappingDO> receiveEmailMappingDOList = receiveEmailMappingService.list(queryWrapper); 123 +// queryWrapper.apply("JSON_CONTAINS(JSON_EXTRACT(config_infos,'$[*].event'),JSON_QUOTE({0}),'$')", eventEnum.getEvent());
119 124
120 - Set<Map<String, List<String>>> set = receiveEmailMappingDOList.stream().map(x -> {  
121 - Map<String, List<String>> map = new HashMap<>();  
122 - String customerCode = x.getTypeValue();  
123 -// ReceiveEmailConfigItemVO receiveEmailConfigItemVO = JSON.parseObject(x.getConfigInfos(), ReceiveEmailConfigItemVO.class);  
124 - List<ReceiveEmailConfigItemVO> receiveEmailConfigItemVOList = JSON.parseObject(  
125 - x.getConfigInfos(), new TypeReference<List<ReceiveEmailConfigItemVO>>() { 125 + List<ReceiveEmailMappingDO> receiveEmailMappingDOList = receiveEmailMappingService.list(queryWrapper);
  126 + List<ReceiveEmailMappingDO> receiveEmailMappingDOS = receiveEmailMappingDOList.stream().map(x -> {
  127 + List<ReceiveEmailConfigItemVO> receiveEmailConfigItemVOList = JSON.parseObject(x.getConfigInfos(), new TypeReference<List<ReceiveEmailConfigItemVO>>() {
126 }); 128 });
127 - List<String> strings1 = new ArrayList<>();  
128 - for (ReceiveEmailConfigItemVO item : receiveEmailConfigItemVOList) {  
129 - strings1 = item.getEmails(); 129 + for (ReceiveEmailConfigItemVO receiveEmailConfigItemVO : receiveEmailConfigItemVOList) {
  130 + if (eventEnum.getEvent().equals(receiveEmailConfigItemVO.getEvent())) {
  131 + return x;
  132 + }
  133 + }
  134 + return null;
  135 + }).filter(Objects::nonNull)
  136 + .collect(Collectors.toList());
  137 + //如果为尾期验货事件的话,需要从订单中的生产科角色中得到邮箱。而不是从邮件配置中得到邮箱。
  138 + if (OrderEventEnum.END_CHECK_DATE_EVENT.equals(eventEnum)) {
  139 + for (OrderEventJobVO orderEventJob : eventJobVOS) {
  140 + String productionDepartment = orderEventJob.getBaseInfo().getProductionDepartment();
  141 + //根据订单的生产科得到生产科用户信息。
  142 + AdminUserDO productionDepartmentUser = adminUserService.getOne(new LambdaQueryWrapper<AdminUserDO>()
  143 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  144 + .eq(AdminUserDO::getUserName, productionDepartment));
  145 + List<String> productionEmail = Arrays.asList(productionDepartmentUser.getEmail().split("[,,]+"))
  146 + .stream().map(String::trim)
  147 + .collect(Collectors.toList());
  148 + emailSendUtils.sendEmail(EmailTemplateEnum.byTemplate(eventEnum.getTemplateId()),
  149 + productionEmail, orderEventJob);
  150 + redisUtils.set(EmailTemplateEnum.byTemplate(
  151 + eventEnum.getTemplateId()) + Constant.CROSS_BAR_CHARACTER + orderEventJob.getBaseInfo().getId(),
  152 + orderEventJob, 90, TimeUnit.DAYS);
130 } 153 }
131 - List<String> emails = strings1;  
132 - map.put(customerCode, emails);  
133 - return map;  
134 - }).collect(Collectors.toSet());  
135 - for (OrderEventJobVO orderEventJob : eventJobVOS) {  
136 - for (Map<String, List<String>> map : set) {  
137 - if (orderEventJob.getBaseInfo().getCustomerCode().equals(map.keySet().iterator().next())) {  
138 - emailSendUtils.sendEmail(EmailTemplateEnum.byTemplate(eventEnum.getTemplateId()),  
139 - map.get(map.keySet().iterator().next()), orderEventJob);  
140 - redisUtils.set(EmailTemplateEnum.byTemplate(  
141 - eventEnum.getTemplateId()) + Constant.CROSS_BAR_CHARACTER + orderEventJob.getBaseInfo().getId(),  
142 - orderEventJob, 90, TimeUnit.DAYS); 154 + } else {
  155 + Set<Map<String, List<String>>> set = receiveEmailMappingDOS.stream().map(x -> {
  156 + Map<String, List<String>> map = new HashMap<>();
  157 + String customerCode = x.getTypeValue();
  158 +// ReceiveEmailConfigItemVO receiveEmailConfigItemVO = JSON.parseObject(x.getConfigInfos(), ReceiveEmailConfigItemVO.class);
  159 + List<ReceiveEmailConfigItemVO> receiveEmailConfigItemVOList = JSON.parseObject(
  160 + x.getConfigInfos(), new TypeReference<List<ReceiveEmailConfigItemVO>>() {
  161 + });
  162 + List<String> emailList = new ArrayList<>();
  163 + for (ReceiveEmailConfigItemVO item : receiveEmailConfigItemVOList) {
  164 + if (eventEnum.getEvent().equals(item.getEvent())) {
  165 + emailList = item.getEmails();
  166 + }
  167 + }
  168 + List<String> emails = emailList;
  169 + map.put(customerCode, emails);
  170 + return map;
  171 + }).collect(Collectors.toSet());
  172 + for (OrderEventJobVO orderEventJob : eventJobVOS) {
  173 + for (Map<String, List<String>> map : set) {
  174 + if (orderEventJob.getBaseInfo().getCustomerCode().equals(map.keySet().iterator().next())) {
  175 + emailSendUtils.sendEmail(EmailTemplateEnum.byTemplate(eventEnum.getTemplateId()),
  176 + map.get(map.keySet().iterator().next()), orderEventJob);
  177 + redisUtils.set(EmailTemplateEnum.byTemplate(
  178 + eventEnum.getTemplateId()) + Constant.CROSS_BAR_CHARACTER + orderEventJob.getBaseInfo().getId(),
  179 + orderEventJob, Constant.REDIS_EMAIL_TIME, TimeUnit.DAYS);
  180 + }
143 } 181 }
144 } 182 }
145 } 183 }
src/main/resources/templates/mail.ftl
@@ -34,7 +34,7 @@ @@ -34,7 +34,7 @@
34 <h3>${context}</h3> 34 <h3>${context}</h3>
35 <table border="1"> 35 <table border="1">
36 <tr id="title1"> 36 <tr id="title1">
37 - <#if title=="中期验货报告" || title=="尾期验货报告"> 37 + <#if title=="中期验货报告">
38 <td> 项目号</td> 38 <td> 项目号</td>
39 <td> 生产科</td> 39 <td> 生产科</td>
40 <td> 内部编号</td> 40 <td> 内部编号</td>
@@ -42,12 +42,34 @@ @@ -42,12 +42,34 @@
42 <td> 客户SYSTEM</td> 42 <td> 客户SYSTEM</td>
43 <td> PO COLOR</td> 43 <td> PO COLOR</td>
44 <td> 订单图片</td> 44 <td> 订单图片</td>
  45 + <td> 生产要求</td>
45 <td> 数量 </td> 46 <td> 数量 </td>
46 <td> 生产科拖货时间</td> 47 <td> 生产科拖货时间</td>
47 <td> 包装类型</td> 48 <td> 包装类型</td>
48 <td> 中期验货申请时间</td> 49 <td> 中期验货申请时间</td>
49 <td> 中期验货(功能性-拉力/跌落等、外观性-颜色/规格等、耐力性-烤厅等)</td> 50 <td> 中期验货(功能性-拉力/跌落等、外观性-颜色/规格等、耐力性-烤厅等)</td>
50 <td> 中期验货结果PASS/FALL</td> 51 <td> 中期验货结果PASS/FALL</td>
  52 + <#elseif title=="尾期验货报告">
  53 + <td> 项目号</td>
  54 + <td> 生产科</td>
  55 + <td> 内部编号</td>
  56 + <td> 客户PO号</td>
  57 + <td> 客户SYSTEM</td>
  58 + <td> PO COLOR</td>
  59 + <td> 订单图片</td>
  60 + <td> 生产要求</td>
  61 + <td> 数量 </td>
  62 + <td> 生产科拖货时间</td>
  63 + <td> 包装类型</td>
  64 + <td> 尾期验货申请时间</td>
  65 + <td> 长度/规格 </td>
  66 + <td> 功能性不良</td>
  67 + <td> 电镀不良 </td>
  68 + <td> 不良1 </td>
  69 + <td> 不良2 </td>
  70 + <td> 不良3 </td>
  71 + <td> 包装:卡片、条码、箱贴、箱单 </td>
  72 + <td> 中期验货结果PASS/FALL </td>
51 <#elseif title=="尾期验货日期"> 73 <#elseif title=="尾期验货日期">
52 <td> 客户编码</td> 74 <td> 客户编码</td>
53 <td> 项目号</td> 75 <td> 项目号</td>
@@ -77,7 +99,7 @@ @@ -77,7 +99,7 @@
77 </#if> 99 </#if>
78 </tr> 100 </tr>
79 <tr id="title2"> 101 <tr id="title2">
80 - <#if title=="中期验货报告" || title=="尾期验货报告"> 102 + <#if title=="中期验货报告" >
81 <td>${data.baseInfo.projectNo! " "}</td> 103 <td>${data.baseInfo.projectNo! " "}</td>
82 <td>${data.baseInfo.productionDepartment! " "}</td> 104 <td>${data.baseInfo.productionDepartment! " "}</td>
83 <td>${data.baseInfo.internalNo! " "}</td> 105 <td>${data.baseInfo.internalNo! " "}</td>
@@ -85,12 +107,34 @@ @@ -85,12 +107,34 @@
85 <td>${data.baseInfo.customerStyle! " "}</td> 107 <td>${data.baseInfo.customerStyle! " "}</td>
86 <td>${data.baseInfo.poColor! " "}</td> 108 <td>${data.baseInfo.poColor! " "}</td>
87 <td><img src="${data.baseInfo.smallPicUrl! " "}" alt="Image"></td> 109 <td><img src="${data.baseInfo.smallPicUrl! " "}" alt="Image"></td>
  110 + <td>${data.baseInfo.productionComment! " "}</td>
88 <td>${data.baseInfo.orderCount! " "}</td> 111 <td>${data.baseInfo.orderCount! " "}</td>
89 <td>${data.baseInfo.productionDepartmentConsignTime! " "}</td> 112 <td>${data.baseInfo.productionDepartmentConsignTime! " "}</td>
90 <td>${data.baseInfo.packetType! " "}</td> 113 <td>${data.baseInfo.packetType! " "}</td>
91 <td>${data.inspectionStageInfo.midCheckApplyTime! " "}</td> 114 <td>${data.inspectionStageInfo.midCheckApplyTime! " "}</td>
92 <td>${data.inspectionStageInfo.midCheckComment! " "}</td> 115 <td>${data.inspectionStageInfo.midCheckComment! " "}</td>
93 <td>${data.inspectionStageInfo.midCheckResult! " "}</td> 116 <td>${data.inspectionStageInfo.midCheckResult! " "}</td>
  117 + <#elseif title=="尾期验货报告">
  118 + <td>${data.baseInfo.projectNo! " "}</td>
  119 + <td>${data.baseInfo.productionDepartment! " "}</td>
  120 + <td>${data.baseInfo.internalNo! " "}</td>
  121 + <td>${data.baseInfo.customerPo! " "}</td>
  122 + <td>${data.baseInfo.customerStyle! " "}</td>
  123 + <td>${data.baseInfo.poColor! " "}</td>
  124 + <td><img src="${data.baseInfo.smallPicUrl! " "}" alt="Image"></td>
  125 + <td>${data.baseInfo.productionComment! " "}</td>
  126 + <td>${data.baseInfo.orderCount! " "}</td>
  127 + <td>${data.baseInfo.productionDepartmentConsignTime! " "}</td>
  128 + <td>${data.baseInfo.packetType! " "}</td>
  129 + <td> ${data.inspectionStageInfo.endCheckApplyTime! " "}</td>
  130 + <td> ${data.inspectionStageInfo.specification! " "} </td>
  131 + <td> ${data.inspectionStageInfo.functionality! " "}</td>
  132 + <td> ${data.inspectionStageInfo.electroplate! " "} </td>
  133 + <td> ${data.inspectionStageInfo.value1! " "}</td>
  134 + <td> ${data.inspectionStageInfo.value2! " "}</td>
  135 + <td> ${data.inspectionStageInfo.value3! " "}</td>
  136 + <td> ${data.inspectionStageInfo.boxPacket! " "} </td>
  137 + <td> ${data.inspectionStageInfo.endCheckResult! " "} </td>
94 <#elseif title=="尾期验货日期"> 138 <#elseif title=="尾期验货日期">
95 <td>${data.baseInfo.customerCode! " "}</td> 139 <td>${data.baseInfo.customerCode! " "}</td>
96 <td>${data.baseInfo.projectNo! " "}</td> 140 <td>${data.baseInfo.projectNo! " "}</td>