Commit e0a1536ed15c7de99dcc7c47041b66fbdc8f5a79
1 parent
9a1e5de5
1.生产指示书添加图片
2.中期/尾期验货报告,尾期验货日期发送给所有质检员 3.产品意见发送全部信息
Showing
7 changed files
with
173 additions
and
51 deletions
src/main/java/com/order/erp/common/utils/EasyPdfUtils.java
@@ -17,6 +17,7 @@ import org.springframework.beans.BeanUtils; | @@ -17,6 +17,7 @@ import org.springframework.beans.BeanUtils; | ||
17 | import org.springframework.beans.factory.annotation.Value; | 17 | import org.springframework.beans.factory.annotation.Value; |
18 | import org.springframework.stereotype.Service; | 18 | import org.springframework.stereotype.Service; |
19 | import wiki.xsx.core.pdf.component.image.XEasyPdfImage; | 19 | import wiki.xsx.core.pdf.component.image.XEasyPdfImage; |
20 | +import wiki.xsx.core.pdf.component.image.XEasyPdfImageType; | ||
20 | import wiki.xsx.core.pdf.component.table.XEasyPdfCell; | 21 | import wiki.xsx.core.pdf.component.table.XEasyPdfCell; |
21 | import wiki.xsx.core.pdf.component.table.XEasyPdfRow; | 22 | import wiki.xsx.core.pdf.component.table.XEasyPdfRow; |
22 | import wiki.xsx.core.pdf.component.table.XEasyPdfTable; | 23 | import wiki.xsx.core.pdf.component.table.XEasyPdfTable; |
@@ -24,13 +25,16 @@ import wiki.xsx.core.pdf.doc.*; | @@ -24,13 +25,16 @@ import wiki.xsx.core.pdf.doc.*; | ||
24 | import wiki.xsx.core.pdf.handler.XEasyPdfHandler; | 25 | import wiki.xsx.core.pdf.handler.XEasyPdfHandler; |
25 | 26 | ||
26 | import javax.annotation.Resource; | 27 | import javax.annotation.Resource; |
28 | +import java.awt.*; | ||
27 | import java.io.File; | 29 | import java.io.File; |
30 | +import java.io.IOException; | ||
28 | import java.io.InputStream; | 31 | import java.io.InputStream; |
29 | import java.io.OutputStream; | 32 | import java.io.OutputStream; |
30 | import java.math.BigDecimal; | 33 | import java.math.BigDecimal; |
31 | import java.math.RoundingMode; | 34 | import java.math.RoundingMode; |
32 | import java.net.URL; | 35 | import java.net.URL; |
33 | import java.util.*; | 36 | import java.util.*; |
37 | +import java.util.List; | ||
34 | import java.util.function.Function; | 38 | import java.util.function.Function; |
35 | import java.util.stream.Collectors; | 39 | import java.util.stream.Collectors; |
36 | //待拷贝start。 | 40 | //待拷贝start。 |
@@ -171,61 +175,67 @@ public class EasyPdfUtils { | @@ -171,61 +175,67 @@ public class EasyPdfUtils { | ||
171 | }*/ | 175 | }*/ |
172 | 176 | ||
173 | //第二版 线上版。 | 177 | //第二版 线上版。 |
174 | - try { | ||
175 | - // 每页最大行数 | ||
176 | - int rowsPerPage = 10; | ||
177 | - int totalRows = pdfVOList.size(); | ||
178 | - int totalPages = (int) Math.ceil((double) totalRows / rowsPerPage); | ||
179 | - | ||
180 | - // 固定页面大小 (1700F 宽, 1000F 高) | ||
181 | - XEasyPdfPageRectangle pageSize = XEasyPdfPageRectangle.create(1700F, 1000F); | ||
182 | - | ||
183 | - // 计算总计 | ||
184 | - Integer totalOrderCount = 0; | ||
185 | - BigDecimal totalPrice = new BigDecimal(Constant.ZERO); | ||
186 | - | ||
187 | - for (OrderProducePdfVO producePdfVO : pdfVOList) { | ||
188 | - totalOrderCount += Objects.nonNull(producePdfVO.getOrderCount()) ? producePdfVO.getOrderCount() : Constant.ZERO; | ||
189 | - totalPrice = totalPrice.add(new BigDecimal(Objects.nonNull(producePdfVO.getProductionDepartmentTotalPrice()) ? producePdfVO.getProductionDepartmentTotalPrice() : Constant.ZERO).setScale(2, RoundingMode.HALF_UP)); | 178 | + try{ |
179 | +//设置页面大小(1700F宽,1000F高) | ||
180 | + XEasyPdfPageRectangle pageSize=XEasyPdfPageRectangle.create(1700F,1000F); | ||
181 | + | ||
182 | +//计算订单的总数和总价 | ||
183 | + Integer totalOrderCount=0; | ||
184 | + BigDecimal totalPrice=new BigDecimal(Constant.ZERO); | ||
185 | + | ||
186 | +//计算所有订单的总量和总价 | ||
187 | + for(OrderProducePdfVO producePdfVO:pdfVOList){ | ||
188 | + totalOrderCount+=Objects.nonNull(producePdfVO.getOrderCount())?producePdfVO.getOrderCount():Constant.ZERO; | ||
189 | + totalPrice=totalPrice.add(new BigDecimal(Objects.nonNull(producePdfVO.getProductionDepartmentTotalPrice())?producePdfVO.getProductionDepartmentTotalPrice():Constant.ZERO).setScale(2,RoundingMode.HALF_UP)); | ||
190 | } | 190 | } |
191 | 191 | ||
192 | - int currentIndex = 1; // 初始化当前编号 | ||
193 | - | ||
194 | - for (int page = 0; page < totalPages; page++) { | ||
195 | - // 计算当前页的数据 | ||
196 | - int startRow = page * rowsPerPage; | ||
197 | - int endRow = Math.min(startRow + rowsPerPage, totalRows); | ||
198 | - List<OrderProducePdfVO> pageData = pdfVOList.subList(startRow, endRow); | ||
199 | - boolean isLastPage = (page == totalPages - 1); | ||
200 | - // 创建表格并填充数据 | ||
201 | - XEasyPdfTable table = createTable(pageData, companyName, currentIndex, isLastPage, totalOrderCount, totalPrice); | ||
202 | - currentIndex += pageData.size(); // 更新编号 | ||
203 | - | ||
204 | - // 创建页面 | ||
205 | - XEasyPdfPage pdfPage = XEasyPdfHandler.Page.build(pageSize, table); | ||
206 | - document.addPage(pdfPage); | 192 | + int currentIndex=1;//初始化当前记录的编号 |
193 | + int totalRows=pdfVOList.size();//获取总行数 | ||
194 | + int currentPageRows=0;//当前页面行数计数器 | ||
195 | + List<OrderProducePdfVO>currentPageData=new ArrayList<>();//当前页的数据 | ||
196 | + boolean isLastPage=false;//标记是否为最后一页 | ||
197 | + | ||
198 | + for(int i=0;i<totalRows;i++){ | ||
199 | + OrderProducePdfVO producePdfVO=pdfVOList.get(i); | ||
200 | + currentPageData.add(producePdfVO);//将当前订单数据加入当前页面的数据列表 | ||
201 | + currentPageRows++;//当前页面行数+1 | ||
202 | + | ||
203 | +//动态计算当前页面是否满了(基于内容长度和当前页面行数) | ||
204 | + if(isPageFull(producePdfVO,currentPageRows)||i==totalRows-1){ | ||
205 | + isLastPage=(i==totalRows-1);//如果是最后一条记录,则标记为最后一页 | ||
206 | + | ||
207 | +//创建表格并填充数据 | ||
208 | + XEasyPdfTable table=createTable(currentPageData,companyName,currentIndex,isLastPage,totalOrderCount,totalPrice); | ||
209 | + currentIndex+=currentPageData.size();//更新编号 | ||
210 | + | ||
211 | +//创建并添加页面 | ||
212 | + XEasyPdfPage pdfPage=XEasyPdfHandler.Page.build(pageSize,table); | ||
213 | + document.addPage(pdfPage); | ||
214 | + | ||
215 | +//清空当前页数据,准备下一页 | ||
216 | + currentPageData.clear(); | ||
217 | + currentPageRows=0; | ||
218 | + } | ||
207 | } | 219 | } |
208 | 220 | ||
209 | - // 添加页脚 | 221 | +//添加页脚以显示页码 |
210 | document.setGlobalFooter(XEasyPdfHandler.Footer.build( | 222 | document.setGlobalFooter(XEasyPdfHandler.Footer.build( |
211 | XEasyPdfHandler.Text.build( | 223 | XEasyPdfHandler.Text.build( |
212 | - XEasyPdfHandler.Page.getCurrentPagePlaceholder() + | ||
213 | - "/" + | ||
214 | - XEasyPdfHandler.Page.getTotalPagePlaceholder()) | 224 | + XEasyPdfHandler.Page.getCurrentPagePlaceholder()+"/"+XEasyPdfHandler.Page.getTotalPagePlaceholder()) |
215 | .setFontSize(10F) | 225 | .setFontSize(10F) |
216 | .setHorizontalStyle(XEasyPdfPositionStyle.CENTER) | 226 | .setHorizontalStyle(XEasyPdfPositionStyle.CENTER) |
217 | .setDefaultFontStyle(XEasyPdfDefaultFontStyle.LIGHT) | 227 | .setDefaultFontStyle(XEasyPdfDefaultFontStyle.LIGHT) |
218 | )); | 228 | )); |
219 | 229 | ||
220 | - // 开启总页码占位符替换 | 230 | +//开启总页码占位符替换 |
221 | document.enableReplaceTotalPagePlaceholder(); | 231 | document.enableReplaceTotalPagePlaceholder(); |
222 | 232 | ||
233 | +//返回生成的PDF文档 | ||
223 | return document; | 234 | return document; |
224 | - } catch (Exception e) { | 235 | + }catch(Exception e){ |
225 | e.printStackTrace(); | 236 | e.printStackTrace(); |
226 | return null; | 237 | return null; |
227 | } | 238 | } |
228 | - | ||
229 | } | 239 | } |
230 | 240 | ||
231 | /** | 241 | /** |
@@ -247,6 +257,20 @@ public class EasyPdfUtils { | @@ -247,6 +257,20 @@ public class EasyPdfUtils { | ||
247 | return cell; | 257 | return cell; |
248 | } | 258 | } |
249 | 259 | ||
260 | + private XEasyPdfCell createImageCell(InputStream imageStream, float width,float height) { | ||
261 | + XEasyPdfImage image = XEasyPdfHandler.Image.build(imageStream, XEasyPdfImageType.PNG). | ||
262 | + setHeight(250F).setWidth(250F). | ||
263 | + setMarginTop(0F).setMarginLeft(0F). | ||
264 | + setVerticalStyle(XEasyPdfPositionStyle.CENTER).setHorizontalStyle(XEasyPdfPositionStyle.CENTER); | ||
265 | + | ||
266 | + XEasyPdfCell cell = XEasyPdfHandler.Table.Row.Cell.build(width, height). | ||
267 | + addContent(image). | ||
268 | + setVerticalStyle(XEasyPdfPositionStyle.CENTER). | ||
269 | + setHorizontalStyle(XEasyPdfPositionStyle.CENTER). | ||
270 | + enableCenterStyle().enableComponentSelfStyle(); | ||
271 | + return cell; | ||
272 | + } | ||
273 | + | ||
250 | /** | 274 | /** |
251 | * @param text | 275 | * @param text |
252 | * @param width | 276 | * @param width |
@@ -399,12 +423,32 @@ public class EasyPdfUtils { | @@ -399,12 +423,32 @@ public class EasyPdfUtils { | ||
399 | } | 423 | } |
400 | 424 | ||
401 | List<XEasyPdfCell> signList = new ArrayList<>(2); | 425 | List<XEasyPdfCell> signList = new ArrayList<>(2); |
426 | + ClassLoader classLoader = getClass().getClassLoader(); | ||
427 | + InputStream imageStream = null; | ||
402 | if ("青岛吉庆天成饰品有限公司".equals(companyName)) { | 428 | if ("青岛吉庆天成饰品有限公司".equals(companyName)) { |
403 | signList.add(createCell("吉庆天成签字+日期:", 640F, 80F, 20F, XEasyPdfDefaultFontStyle.BOLD, XEasyPdfPositionStyle.CENTER, XEasyPdfPositionStyle.LEFT)); | 429 | signList.add(createCell("吉庆天成签字+日期:", 640F, 80F, 20F, XEasyPdfDefaultFontStyle.BOLD, XEasyPdfPositionStyle.CENTER, XEasyPdfPositionStyle.LEFT)); |
430 | + imageStream = classLoader.getResourceAsStream("images/jqtc.png"); | ||
404 | } else { | 431 | } else { |
405 | signList.add(createCell("翱特逸格签字+日期:", 640F, 80F, 20F, XEasyPdfDefaultFontStyle.BOLD, XEasyPdfPositionStyle.CENTER, XEasyPdfPositionStyle.LEFT)); | 432 | signList.add(createCell("翱特逸格签字+日期:", 640F, 80F, 20F, XEasyPdfDefaultFontStyle.BOLD, XEasyPdfPositionStyle.CENTER, XEasyPdfPositionStyle.LEFT)); |
433 | + imageStream = classLoader.getResourceAsStream("images/alterego.png"); | ||
434 | + } | ||
435 | + if (imageStream != null) { | ||
436 | + XEasyPdfCell imageCell = createImageCell(imageStream, 150F,150F); | ||
437 | + // 设置图片超出边框的效果 | ||
438 | + imageCell.setMarginLeft(-380F) | ||
439 | + .setMarginTop(0F) | ||
440 | + .disableBorder(); | ||
441 | + signList.add(imageCell); | ||
442 | + try { | ||
443 | + imageStream.close(); | ||
444 | + } catch (IOException e) { | ||
445 | + System.out.println("关闭图片流时发生错误:" + e.getMessage()); | ||
446 | + } | ||
447 | + }else { | ||
448 | + log.info("图片资源未找到或不存在"); | ||
406 | } | 449 | } |
407 | - signList.add(createCell("外加工签字+日期:", 1020F, 80F, 20F, XEasyPdfDefaultFontStyle.BOLD, XEasyPdfPositionStyle.CENTER, XEasyPdfPositionStyle.LEFT)); | 450 | + |
451 | + signList.add(createCell("外加工签字+日期:", 1020F, 80F, 20F, XEasyPdfDefaultFontStyle.BOLD, XEasyPdfPositionStyle.CENTER, XEasyPdfPositionStyle.LEFT).setMarginLeft(230F)); | ||
408 | rowList.add(XEasyPdfHandler.Table.Row.build(signList)); | 452 | rowList.add(XEasyPdfHandler.Table.Row.build(signList)); |
409 | 453 | ||
410 | table.addRow(rowList); | 454 | table.addRow(rowList); |
@@ -412,6 +456,15 @@ public class EasyPdfUtils { | @@ -412,6 +456,15 @@ public class EasyPdfUtils { | ||
412 | return table; | 456 | return table; |
413 | } | 457 | } |
414 | 458 | ||
459 | +//新代码9:22 | ||
460 | +//根据当前行数和"产品意见"的长度动态判断页面是否已经满了 | ||
461 | + | ||
462 | + private boolean isPageFull(OrderProducePdfVO producePdfVO,int currentPageRows){ | ||
463 | + int maxRowsPerPage=9;//假设初始每页最多可以放10行数据 | ||
464 | + int extraRowsForComment=(int)Math.ceil((double)producePdfVO.getProductionComment().length()/25);//假设每50个字符占一行 | ||
465 | +//如果当前行数+根据"产品意见"计算出的额外行数超过每页最大行数,返回true表示页面已满 | ||
466 | + return(currentPageRows+extraRowsForComment)>=maxRowsPerPage; | ||
467 | + } | ||
415 | 468 | ||
416 | } | 469 | } |
417 | //待拷贝end。 | 470 | //待拷贝end。 |
418 | \ No newline at end of file | 471 | \ No newline at end of file |
src/main/java/com/order/erp/job/OrderOverTimeEventJob.java
@@ -8,13 +8,18 @@ import com.order.erp.common.constant.Constant; | @@ -8,13 +8,18 @@ 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.RoleEnum; | ||
11 | import com.order.erp.domain.dto.BaseDO; | 12 | import com.order.erp.domain.dto.BaseDO; |
13 | +import com.order.erp.domain.dto.admin.AdminRoleDO; | ||
12 | import com.order.erp.domain.dto.admin.AdminUserDO; | 14 | import com.order.erp.domain.dto.admin.AdminUserDO; |
15 | +import com.order.erp.domain.dto.admin.AdminUserRoleDO; | ||
13 | import com.order.erp.domain.dto.order.OrderBaseInfoDO; | 16 | import com.order.erp.domain.dto.order.OrderBaseInfoDO; |
14 | import com.order.erp.domain.dto.order.OrderInspectionStageDO; | 17 | import com.order.erp.domain.dto.order.OrderInspectionStageDO; |
15 | import com.order.erp.domain.dto.order.OrderTrackStageDO; | 18 | import com.order.erp.domain.dto.order.OrderTrackStageDO; |
16 | import com.order.erp.domain.dto.order.ReceiveEmailMappingDO; | 19 | import com.order.erp.domain.dto.order.ReceiveEmailMappingDO; |
17 | import com.order.erp.domain.vo.order.*; | 20 | import com.order.erp.domain.vo.order.*; |
21 | +import com.order.erp.service.admin.AdminRoleService; | ||
22 | +import com.order.erp.service.admin.AdminUserRoleService; | ||
18 | import com.order.erp.service.admin.AdminUserService; | 23 | import com.order.erp.service.admin.AdminUserService; |
19 | import com.order.erp.service.order.*; | 24 | import com.order.erp.service.order.*; |
20 | import lombok.extern.slf4j.Slf4j; | 25 | import lombok.extern.slf4j.Slf4j; |
@@ -64,6 +69,8 @@ public class OrderOverTimeEventJob { | @@ -64,6 +69,8 @@ public class OrderOverTimeEventJob { | ||
64 | 69 | ||
65 | @Resource | 70 | @Resource |
66 | private AdminUserService adminUserService; | 71 | private AdminUserService adminUserService; |
72 | + @Resource | ||
73 | + private AdminUserRoleService adminUserRoleService; | ||
67 | 74 | ||
68 | /** | 75 | /** |
69 | * 凌晨1点执行,一天一次 | 76 | * 凌晨1点执行,一天一次 |
@@ -123,7 +130,7 @@ public class OrderOverTimeEventJob { | @@ -123,7 +130,7 @@ public class OrderOverTimeEventJob { | ||
123 | return null; | 130 | return null; |
124 | }).filter(Objects::nonNull) | 131 | }).filter(Objects::nonNull) |
125 | .collect(Collectors.toList()); | 132 | .collect(Collectors.toList()); |
126 | - //如果为尾期验货事件的话,需要从订单中的生产科角色中得到邮箱。而不是从邮件配置中得到邮箱。 | 133 | + //如果为尾期验货事件的话,需要从订单中的生产科角色中得到邮箱。而不是从邮件配置中得到邮箱。并且还需要发送给所有的质检员。 |
127 | if (OrderEventEnum.END_CHECK_DATE_EVENT.equals(eventEnum)) { | 134 | if (OrderEventEnum.END_CHECK_DATE_EVENT.equals(eventEnum)) { |
128 | for (OrderEventJobVO orderEventJob : eventJobVOS) { | 135 | for (OrderEventJobVO orderEventJob : eventJobVOS) { |
129 | if (!redisUtils.hasKey(EmailTemplateEnum.byTemplate( | 136 | if (!redisUtils.hasKey(EmailTemplateEnum.byTemplate( |
@@ -137,6 +144,19 @@ public class OrderOverTimeEventJob { | @@ -137,6 +144,19 @@ public class OrderOverTimeEventJob { | ||
137 | AdminUserDO productionDepartmentUser = adminUserService.getOne(new LambdaQueryWrapper<AdminUserDO>() | 144 | AdminUserDO productionDepartmentUser = adminUserService.getOne(new LambdaQueryWrapper<AdminUserDO>() |
138 | .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) | 145 | .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) |
139 | .eq(AdminUserDO::getUserName, productionDepartment)); | 146 | .eq(AdminUserDO::getUserName, productionDepartment)); |
147 | + //得到所有的质检员。由于删除了角色,但是用户角色表中的信息没有删除,所以不能直接通过用户角色表拿角色,然后发邮件,需校验。 | ||
148 | + List<AdminUserRoleDO> UserRoleList = adminUserRoleService.list(new LambdaQueryWrapper<AdminUserRoleDO>() | ||
149 | + .eq(AdminUserRoleDO::getRoleId, RoleEnum.INSPECT_USER.getId())); | ||
150 | + Set<Long> userIdList = UserRoleList.stream().map(AdminUserRoleDO::getUserId).collect(Collectors.toSet()); | ||
151 | + List<AdminUserDO> produceList = adminUserService.list(new LambdaQueryWrapper<AdminUserDO>() | ||
152 | + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) | ||
153 | + .in(AdminUserDO::getId, userIdList) | ||
154 | + .eq(AdminUserDO::getStatus,Constant.ENABLE_TEN)); | ||
155 | + List<String> produceEmailList = produceList.stream().map(AdminUserDO::getEmail).filter(Objects::nonNull) | ||
156 | + .flatMap(email -> Arrays.asList(email.split("[,,]+")).stream()) | ||
157 | + .map(String::trim) | ||
158 | + .filter(s -> !s.isEmpty()) | ||
159 | + .collect(Collectors.toList()); | ||
140 | log.info("------------------------------------------------------------------------------------"); | 160 | log.info("------------------------------------------------------------------------------------"); |
141 | //得到订单的尾期验货日期的邮件配置中的邮箱。 | 161 | //得到订单的尾期验货日期的邮件配置中的邮箱。 |
142 | LambdaQueryWrapper<ReceiveEmailMappingDO> receiveEmailMappingDOLambdaQueryWrapper = new LambdaQueryWrapper<>(); | 162 | LambdaQueryWrapper<ReceiveEmailMappingDO> receiveEmailMappingDOLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
@@ -167,6 +187,9 @@ public class OrderOverTimeEventJob { | @@ -167,6 +187,9 @@ public class OrderOverTimeEventJob { | ||
167 | .filter(Objects::nonNull) | 187 | .filter(Objects::nonNull) |
168 | .collect(Collectors.toList()); | 188 | .collect(Collectors.toList()); |
169 | List<String> combineEmail = new ArrayList<>(emails); | 189 | List<String> combineEmail = new ArrayList<>(emails); |
190 | + if(CollectionUtils.isNotEmpty(produceEmailList)){ | ||
191 | + combineEmail.addAll(produceEmailList); | ||
192 | + } | ||
170 | combineEmail.addAll(productionEmail); | 193 | combineEmail.addAll(productionEmail); |
171 | emailSendUtils.sendEmail(EmailTemplateEnum.byTemplate(eventEnum.getTemplateId()), | 194 | emailSendUtils.sendEmail(EmailTemplateEnum.byTemplate(eventEnum.getTemplateId()), |
172 | combineEmail, orderEventJob); | 195 | combineEmail, orderEventJob); |
src/main/java/com/order/erp/service/admin/impl/AdminUserServiceImpl.java
@@ -203,6 +203,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser | @@ -203,6 +203,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser | ||
203 | throw new BusinessException("用户名已存在"); | 203 | throw new BusinessException("用户名已存在"); |
204 | } | 204 | } |
205 | if (StringUtils.isNotBlank(adminUserVO.getNickName())) { | 205 | if (StringUtils.isNotBlank(adminUserVO.getNickName())) { |
206 | + //后续如果根据名称找用户,使用userName比较,不要使用NickName比较。 | ||
206 | adminUserDo.setUserName(adminUserVO.getNickName()); | 207 | adminUserDo.setUserName(adminUserVO.getNickName()); |
207 | } | 208 | } |
208 | adminUserDo.setGender("男"); | 209 | adminUserDo.setGender("男"); |
src/main/java/com/order/erp/service/order/impl/OrderBaseInfoServiceImpl.java
@@ -27,12 +27,14 @@ import com.order.erp.domain.*; | @@ -27,12 +27,14 @@ import com.order.erp.domain.*; | ||
27 | import com.order.erp.domain.dto.BaseDO; | 27 | import com.order.erp.domain.dto.BaseDO; |
28 | import com.order.erp.domain.dto.SystemSettingDO; | 28 | import com.order.erp.domain.dto.SystemSettingDO; |
29 | import com.order.erp.domain.dto.admin.AdminUserDO; | 29 | import com.order.erp.domain.dto.admin.AdminUserDO; |
30 | +import com.order.erp.domain.dto.admin.AdminUserRoleDO; | ||
30 | import com.order.erp.domain.dto.order.*; | 31 | import com.order.erp.domain.dto.order.*; |
31 | import com.order.erp.domain.vo.ProducePdfVO; | 32 | import com.order.erp.domain.vo.ProducePdfVO; |
32 | import com.order.erp.domain.vo.order.*; | 33 | import com.order.erp.domain.vo.order.*; |
33 | import com.order.erp.job.OrderOverTimeEventJob; | 34 | import com.order.erp.job.OrderOverTimeEventJob; |
34 | import com.order.erp.mapper.order.OrderBaseInfoMapper; | 35 | import com.order.erp.mapper.order.OrderBaseInfoMapper; |
35 | import com.order.erp.service.SystemSettingService; | 36 | import com.order.erp.service.SystemSettingService; |
37 | +import com.order.erp.service.admin.AdminUserRoleService; | ||
36 | import com.order.erp.service.admin.AdminUserService; | 38 | import com.order.erp.service.admin.AdminUserService; |
37 | import com.order.erp.service.order.*; | 39 | import com.order.erp.service.order.*; |
38 | import freemarker.template.TemplateException; | 40 | import freemarker.template.TemplateException; |
@@ -135,6 +137,8 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | @@ -135,6 +137,8 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | ||
135 | 137 | ||
136 | @Resource | 138 | @Resource |
137 | private ReceiveEmailMappingService receiveEmailMappingService; | 139 | private ReceiveEmailMappingService receiveEmailMappingService; |
140 | + @Resource | ||
141 | + private AdminUserRoleService adminUserRoleService; | ||
138 | 142 | ||
139 | 143 | ||
140 | /** | 144 | /** |
@@ -904,7 +908,7 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | @@ -904,7 +908,7 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | ||
904 | if (CollectionUtils.isEmpty(trackStageDOS)) { | 908 | if (CollectionUtils.isEmpty(trackStageDOS)) { |
905 | return; | 909 | return; |
906 | } | 910 | } |
907 | - Map<Long, OrderTrackStageDO> trackStageDOMap = trackStageDOS.stream().collect(Collectors.toMap(OrderTrackStageDO::getOrderId, Function.identity())); | 911 | + Map<Long, OrderTrackStageDO> trackStageDOMap = trackStageDOS.stream().collect(Collectors.toMap(OrderTrackStageDO::getOrderId, Function.identity(),(existing, replacement) -> existing)); |
908 | orderInfoResultVOList.forEach(result -> { | 912 | orderInfoResultVOList.forEach(result -> { |
909 | if (trackStageDOMap.containsKey(result.getId())) { | 913 | if (trackStageDOMap.containsKey(result.getId())) { |
910 | OrderTrackStageDO trackStageDO = trackStageDOMap.get(result.getId()); | 914 | OrderTrackStageDO trackStageDO = trackStageDOMap.get(result.getId()); |
@@ -2203,6 +2207,14 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | @@ -2203,6 +2207,14 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | ||
2203 | if (CollectionUtils.isEmpty(orderProfitAnalysisList) || producePdfVO.getIds().size() != orderProfitAnalysisList.size()) { | 2207 | if (CollectionUtils.isEmpty(orderProfitAnalysisList) || producePdfVO.getIds().size() != orderProfitAnalysisList.size()) { |
2204 | return ServerResult.fail("利润分析未填写,无法进行生成!"); | 2208 | return ServerResult.fail("利润分析未填写,无法进行生成!"); |
2205 | } | 2209 | } |
2210 | + List<OrderFieldLockApplyDO> orderFieldLockApplyDOS = orderFieldLockApplyService.list(new LambdaQueryWrapper<OrderFieldLockApplyDO>() | ||
2211 | + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) | ||
2212 | + .in(OrderFieldLockApplyDO::getOrderId, producePdfVO.getIds()) | ||
2213 | + .eq(OrderFieldLockApplyDO::getType, ApplyTypeEnum.ORDER_PROFIT_APPLY.getType()) | ||
2214 | + .eq(OrderFieldLockApplyDO::getStatus,ApplyStatusEnum.WAIT_AUDIT.getStatus())); | ||
2215 | + if(CollectionUtils.isNotEmpty(orderFieldLockApplyDOS)){ | ||
2216 | + return ServerResult.fail("订单中包含利润未审批的订单,无法生成!"); | ||
2217 | + } | ||
2206 | ProducePdfVO producePdf = pdfUtils.createProducePdf(pdfUtils.build(producePdfVO.getIds()), "生产指示书.pdf", producePdfVO.getCompanyName()); | 2218 | ProducePdfVO producePdf = pdfUtils.createProducePdf(pdfUtils.build(producePdfVO.getIds()), "生产指示书.pdf", producePdfVO.getCompanyName()); |
2207 | return ServerResult.success(producePdf); | 2219 | return ServerResult.success(producePdf); |
2208 | } | 2220 | } |
@@ -2319,7 +2331,7 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | @@ -2319,7 +2331,7 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | ||
2319 | if(CollectionUtils.isNotEmpty(producePdfVO.getPersonList())){ | 2331 | if(CollectionUtils.isNotEmpty(producePdfVO.getPersonList())){ |
2320 | List<AdminUserDO> personUser = adminUserService.list(new LambdaQueryWrapper<AdminUserDO>() | 2332 | List<AdminUserDO> personUser = adminUserService.list(new LambdaQueryWrapper<AdminUserDO>() |
2321 | .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) | 2333 | .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) |
2322 | - .in(AdminUserDO::getNickName, producePdfVO.getPersonList())); | 2334 | + .in(AdminUserDO::getUserName, producePdfVO.getPersonList())); |
2323 | if(CollectionUtils.isNotEmpty(personUser)){ | 2335 | if(CollectionUtils.isNotEmpty(personUser)){ |
2324 | List<String> personList = personUser.stream().map(AdminUserDO::getEmail).filter(Objects::nonNull) | 2336 | List<String> personList = personUser.stream().map(AdminUserDO::getEmail).filter(Objects::nonNull) |
2325 | .flatMap(email -> Arrays.asList(email.split("[,,]+")).stream()) | 2337 | .flatMap(email -> Arrays.asList(email.split("[,,]+")).stream()) |
@@ -2386,6 +2398,19 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | @@ -2386,6 +2398,19 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | ||
2386 | .last("limit 1"); | 2398 | .last("limit 1"); |
2387 | } | 2399 | } |
2388 | ReceiveEmailMappingDO receiveEmailMappingDO = receiveEmailMappingService.getOne( receiveEmailMappingDOLambdaQueryWrapper); | 2400 | ReceiveEmailMappingDO receiveEmailMappingDO = receiveEmailMappingService.getOne( receiveEmailMappingDOLambdaQueryWrapper); |
2401 | + //得到所有的质检员。由于删除了角色,但是用户角色表中的信息没有删除,所以不能直接通过用户角色表拿角色,然后发邮件,需校验。 | ||
2402 | + List<AdminUserRoleDO> UserRoleList = adminUserRoleService.list(new LambdaQueryWrapper<AdminUserRoleDO>() | ||
2403 | + .eq(AdminUserRoleDO::getRoleId, RoleEnum.INSPECT_USER.getId())); | ||
2404 | + Set<Long> userIdList = UserRoleList.stream().map(AdminUserRoleDO::getUserId).collect(Collectors.toSet()); | ||
2405 | + List<AdminUserDO> produceList = adminUserService.list(new LambdaQueryWrapper<AdminUserDO>() | ||
2406 | + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) | ||
2407 | + .in(AdminUserDO::getId, userIdList) | ||
2408 | + .eq(AdminUserDO::getStatus,Constant.ENABLE_TEN)); | ||
2409 | + List<String> produceEmailList = produceList.stream().map(AdminUserDO::getEmail).filter(Objects::nonNull) | ||
2410 | + .flatMap(email -> Arrays.asList(email.split("[,,]+")).stream()) | ||
2411 | + .map(String::trim) | ||
2412 | + .filter(s -> !s.isEmpty()) | ||
2413 | + .collect(Collectors.toList()); | ||
2389 | 2414 | ||
2390 | List<String> emailList = new ArrayList<>(); | 2415 | List<String> emailList = new ArrayList<>(); |
2391 | if (Objects.nonNull(receiveEmailMappingDO)) { | 2416 | if (Objects.nonNull(receiveEmailMappingDO)) { |
@@ -2401,6 +2426,9 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | @@ -2401,6 +2426,9 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | ||
2401 | if (CollectionUtils.isNotEmpty(emails) && CollectionUtils.isNotEmpty(emailList)) { | 2426 | if (CollectionUtils.isNotEmpty(emails) && CollectionUtils.isNotEmpty(emailList)) { |
2402 | List<String> emailLists = emailList.stream().flatMap(email -> Arrays.stream(email.split("[,,]+"))).collect(Collectors.toList()); | 2427 | List<String> emailLists = emailList.stream().flatMap(email -> Arrays.stream(email.split("[,,]+"))).collect(Collectors.toList()); |
2403 | List<String> combineEmail = new ArrayList<>(emails); | 2428 | List<String> combineEmail = new ArrayList<>(emails); |
2429 | + if(CollectionUtils.isNotEmpty(produceEmailList)){ | ||
2430 | + combineEmail.addAll(produceEmailList); | ||
2431 | + } | ||
2404 | combineEmail.addAll(emailLists); | 2432 | combineEmail.addAll(emailLists); |
2405 | 2433 | ||
2406 | //尾期验货报告。 | 2434 | //尾期验货报告。 |
@@ -2424,6 +2452,19 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | @@ -2424,6 +2452,19 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | ||
2424 | .last("limit 1"); | 2452 | .last("limit 1"); |
2425 | } | 2453 | } |
2426 | ReceiveEmailMappingDO receiveEmailMappingDO = receiveEmailMappingService.getOne( receiveEmailMappingDOLambdaQueryWrapper); | 2454 | ReceiveEmailMappingDO receiveEmailMappingDO = receiveEmailMappingService.getOne( receiveEmailMappingDOLambdaQueryWrapper); |
2455 | + //得到所有的质检员。由于删除了角色,但是用户角色表中的信息没有删除,所以不能直接通过用户角色表拿角色,然后发邮件,需校验。 | ||
2456 | + List<AdminUserRoleDO> UserRoleList = adminUserRoleService.list(new LambdaQueryWrapper<AdminUserRoleDO>() | ||
2457 | + .eq(AdminUserRoleDO::getRoleId, RoleEnum.INSPECT_USER.getId())); | ||
2458 | + Set<Long> userIdList = UserRoleList.stream().map(AdminUserRoleDO::getUserId).collect(Collectors.toSet()); | ||
2459 | + List<AdminUserDO> produceList = adminUserService.list(new LambdaQueryWrapper<AdminUserDO>() | ||
2460 | + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) | ||
2461 | + .in(AdminUserDO::getId, userIdList) | ||
2462 | + .eq(AdminUserDO::getStatus,Constant.ENABLE_TEN)); | ||
2463 | + List<String> produceEmailList = produceList.stream().map(AdminUserDO::getEmail).filter(Objects::nonNull) | ||
2464 | + .flatMap(email -> Arrays.asList(email.split("[,,]+")).stream()) | ||
2465 | + .map(String::trim) | ||
2466 | + .filter(s -> !s.isEmpty()) | ||
2467 | + .collect(Collectors.toList()); | ||
2427 | List<String> emailList = new ArrayList<>(); | 2468 | List<String> emailList = new ArrayList<>(); |
2428 | if (Objects.nonNull(receiveEmailMappingDO)) { | 2469 | if (Objects.nonNull(receiveEmailMappingDO)) { |
2429 | List<ReceiveEmailConfigItemVO> receiveEmailConfigItemVOList = JSON.parseObject( | 2470 | List<ReceiveEmailConfigItemVO> receiveEmailConfigItemVOList = JSON.parseObject( |
@@ -2438,6 +2479,9 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | @@ -2438,6 +2479,9 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | ||
2438 | if (CollectionUtils.isNotEmpty(emails) && CollectionUtils.isNotEmpty(emailList)) { | 2479 | if (CollectionUtils.isNotEmpty(emails) && CollectionUtils.isNotEmpty(emailList)) { |
2439 | List<String> emailLists = emailList.stream().flatMap(email -> Arrays.stream(email.split("[,,]+"))).collect(Collectors.toList()); | 2480 | List<String> emailLists = emailList.stream().flatMap(email -> Arrays.stream(email.split("[,,]+"))).collect(Collectors.toList()); |
2440 | List<String> combineEmail = new ArrayList<>(emails); | 2481 | List<String> combineEmail = new ArrayList<>(emails); |
2482 | + if(CollectionUtils.isNotEmpty(produceEmailList)){ | ||
2483 | + combineEmail.addAll(produceEmailList); | ||
2484 | + } | ||
2441 | combineEmail.addAll(emailLists); | 2485 | combineEmail.addAll(emailLists); |
2442 | //中期验货报告。 | 2486 | //中期验货报告。 |
2443 | emailSendUtils.sendEmail(EmailTemplateEnum.MID_CHECK_REPORT_TEMPLATE, combineEmail, orderEventJobVO); | 2487 | emailSendUtils.sendEmail(EmailTemplateEnum.MID_CHECK_REPORT_TEMPLATE, combineEmail, orderEventJobVO); |
@@ -2469,10 +2513,11 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | @@ -2469,10 +2513,11 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O | ||
2469 | orderEventJobVO.getBaseInfo().setPoColor(orderBaseInfoDo.getPoColor()); | 2513 | orderEventJobVO.getBaseInfo().setPoColor(orderBaseInfoDo.getPoColor()); |
2470 | orderEventJobVO.getBaseInfo().setSmallPicUrl(orderBaseInfoDo.getSmallPicUrl()); | 2514 | orderEventJobVO.getBaseInfo().setSmallPicUrl(orderBaseInfoDo.getSmallPicUrl()); |
2471 | orderEventJobVO.getBaseInfo().setOrderCount(orderBaseInfoDo.getOrderCount()); | 2515 | orderEventJobVO.getBaseInfo().setOrderCount(orderBaseInfoDo.getOrderCount()); |
2472 | - String[] split = productionComment.split("\n"); | ||
2473 | - String[] split1 = split[split.length - 1].split("[::]+"); | ||
2474 | - String lastProductionComment = split1[split1.length - 1]; | ||
2475 | - orderEventJobVO.getBaseInfo().setProductionComment(lastProductionComment); | 2516 | +// String[] split = productionComment.split("\n"); |
2517 | +// String[] split1 = split[split.length - 1].split("[::]+"); | ||
2518 | + //这里需要设置不单单只发送最后一条消息。应该是所有的消息。 | ||
2519 | +// String lastProductionComment = split1[split1.length - 1]; | ||
2520 | + orderEventJobVO.getBaseInfo().setProductionComment(productionComment); | ||
2476 | orderEventJobVO.getBaseInfo().setProductionDepartmentConsignTime(orderBaseInfoDo.getProductionDepartmentConsignTime().substring(0, 10)); | 2521 | orderEventJobVO.getBaseInfo().setProductionDepartmentConsignTime(orderBaseInfoDo.getProductionDepartmentConsignTime().substring(0, 10)); |
2477 | //目前是选择的是跟单员邮箱和业务员邮箱。 | 2522 | //目前是选择的是跟单员邮箱和业务员邮箱。 |
2478 | emailSendUtils.sendEmail(EmailTemplateEnum.PRODUCE_IDEA, emailList, orderEventJobVO); | 2523 | emailSendUtils.sendEmail(EmailTemplateEnum.PRODUCE_IDEA, emailList, orderEventJobVO); |
src/main/resources/images/alterego.png
0 → 100644
441 KB
src/main/resources/images/jqtc.png
0 → 100644
410 KB
src/main/resources/templates/mail.ftl
@@ -43,7 +43,7 @@ | @@ -43,7 +43,7 @@ | ||
43 | <td> 客户SYSTEM</td> | 43 | <td> 客户SYSTEM</td> |
44 | <td> PO COLOR</td> | 44 | <td> PO COLOR</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> |
@@ -58,7 +58,7 @@ | @@ -58,7 +58,7 @@ | ||
58 | <td> 客户SYSTEM</td> | 58 | <td> 客户SYSTEM</td> |
59 | <td> PO COLOR</td> | 59 | <td> PO COLOR</td> |
60 | <td> 订单图片</td> | 60 | <td> 订单图片</td> |
61 | - <td> 生产要求</td> | 61 | + <td> 产品意见</td> |
62 | <td> 数量 </td> | 62 | <td> 数量 </td> |
63 | <td> 生产科拖货时间</td> | 63 | <td> 生产科拖货时间</td> |
64 | <td> 包装类型</td> | 64 | <td> 包装类型</td> |
@@ -80,7 +80,7 @@ | @@ -80,7 +80,7 @@ | ||
80 | <td> 客户SYSTEM</td> | 80 | <td> 客户SYSTEM</td> |
81 | <td> PO COLOR</td> | 81 | <td> PO COLOR</td> |
82 | <td> 订单图片</td> | 82 | <td> 订单图片</td> |
83 | - <td> 生产要求</td> | 83 | + <td> 产品意见</td> |
84 | <td> 数量</td> | 84 | <td> 数量</td> |
85 | <td> 生产科拖货时间</td> | 85 | <td> 生产科拖货时间</td> |
86 | <#elseif title=="产品意见信息" > | 86 | <#elseif title=="产品意见信息" > |
@@ -91,7 +91,7 @@ | @@ -91,7 +91,7 @@ | ||
91 | <td> 客户SYSTEM</td> | 91 | <td> 客户SYSTEM</td> |
92 | <td> PO COLOR</td> | 92 | <td> PO COLOR</td> |
93 | <td> 订单图片</td> | 93 | <td> 订单图片</td> |
94 | - <td> 生产要求</td> | 94 | + <td> 产品意见</td> |
95 | <td> 数量</td> | 95 | <td> 数量</td> |
96 | <td> 生产科拖货时间</td> | 96 | <td> 生产科拖货时间</td> |
97 | <#else> | 97 | <#else> |
@@ -103,7 +103,7 @@ | @@ -103,7 +103,7 @@ | ||
103 | <td> 客户SYSTEM</td> | 103 | <td> 客户SYSTEM</td> |
104 | <td> PO COLOR</td> | 104 | <td> PO COLOR</td> |
105 | <td> 订单图片</td> | 105 | <td> 订单图片</td> |
106 | - <td> 生产要求</td> | 106 | + <td> 产品意见</td> |
107 | <td> 数量</td> | 107 | <td> 数量</td> |
108 | <td> 生产科拖货时间</td> | 108 | <td> 生产科拖货时间</td> |
109 | <td> 订单上的HOD时间</td> | 109 | <td> 订单上的HOD时间</td> |