From e04a3cfe29914cc7418504e78701dd512fed0d3a Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期一, 27 四月 2026 11:50:00 +0800
Subject: [PATCH] feat: 计划时间格式调整为年月日+时分秒;多选报工人;生产报工只能看指定报告人
---
src/main/resources/mapper/production/ProductWorkOrderMapper.xml | 16 ++
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java | 104 ++++++++++++++++-
src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java | 26 ++--
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java | 4
src/main/java/com/ruoyi/production/pojo/ProductWorkOrderRapporteur.java | 54 +++++++++
src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java | 54 +++++++-
doc/君歌化工.sql | 8 +
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java | 17 ++
src/main/java/com/ruoyi/production/mapper/ProductWorkOrderRapporteurMapper.java | 9 +
doc/20260427_create_table_product_work_order_rapporteur.sql | 16 ++
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java | 27 ++--
11 files changed, 284 insertions(+), 51 deletions(-)
diff --git a/doc/20260427_create_table_product_work_order_rapporteur.sql b/doc/20260427_create_table_product_work_order_rapporteur.sql
new file mode 100644
index 0000000..e325211
--- /dev/null
+++ b/doc/20260427_create_table_product_work_order_rapporteur.sql
@@ -0,0 +1,16 @@
+drop table if exists product_work_order_rapporteur;
+create table product_work_order_rapporteur
+(
+ id bigint auto_increment primary key,
+ work_order_id bigint not null comment '宸ュ崟ID',
+ user_id bigint not null comment '鎶ュ憡浜篒D',
+ create_time datetime null comment '鍒涘缓鏃堕棿',
+ create_user int null comment '鍒涘缓鐢ㄦ埛',
+ update_time datetime null comment '淇敼鏃堕棿',
+ update_user int null comment '淇敼鐢ㄦ埛',
+ tenant_id bigint not null comment '绉熸埛ID',
+ dept_id bigint null comment '閮ㄩ棬ID',
+ unique key uk_work_order_user (work_order_id, user_id),
+ key idx_work_order_id (work_order_id),
+ key idx_user_id (user_id)
+) comment ='浜у搧宸ュ崟-鎶ュ憡浜哄叧鑱旇〃';
diff --git "a/doc/\345\220\233\346\255\214\345\214\226\345\267\245.sql" "b/doc/\345\220\233\346\255\214\345\214\226\345\267\245.sql"
index 182974d..c05c511 100644
--- "a/doc/\345\220\233\346\255\214\345\214\226\345\267\245.sql"
+++ "b/doc/\345\220\233\346\255\214\345\214\226\345\267\245.sql"
@@ -35,4 +35,10 @@
ALTER TABLE `product-inventory-management-jghg`.`product_process_route_item`
ADD COLUMN `type` int NULL COMMENT '绫诲瀷1-鍔犲伐锛�2-鍒澘鍐疯姱鍒朵綔銆�3-绠¤矾缁勫銆�4-缃愪綋杩炴帴鍙婅皟璇曪紝5-娴嬭瘯鎵撳帇锛�6-鍏朵粬' AFTER `dept_id`,
ADD COLUMN `planner_id` bigint NULL COMMENT '璁″垝浜哄憳ID' AFTER `type`,
- ADD COLUMN `planner_name` varchar(255) NULL COMMENT '璁″垝浜哄憳濮撳悕' AFTER `planner_id`;
\ No newline at end of file
+ ADD COLUMN `planner_name` varchar(255) NULL COMMENT '璁″垝浜哄憳濮撳悕' AFTER `planner_id`;
+
+ALTER TABLE `product-inventory-management-jghg`.`product_work_order`
+ MODIFY COLUMN `plan_start_time` datetime NULL DEFAULT NULL COMMENT '璁″垝寮�濮嬫椂闂�' AFTER `work_order_no`,
+ MODIFY COLUMN `plan_end_time` datetime NULL DEFAULT NULL COMMENT '璁″垝缁撴潫鏃堕棿' AFTER `plan_start_time`,
+ MODIFY COLUMN `actual_start_time` datetime NULL DEFAULT NULL COMMENT '瀹為檯寮�濮嬫椂闂�' AFTER `plan_end_time`,
+ MODIFY COLUMN `actual_end_time` datetime NULL DEFAULT NULL COMMENT '瀹為檯缁撴潫鏃堕棿' AFTER `actual_start_time`;
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index 9a58b22..4f6fe9e 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -584,8 +584,8 @@
public ProductionTurnoverDto workInProcessTurnover() {
ProductionTurnoverDto productionTurnoverDto = new ProductionTurnoverDto();
ProductWorkOrderDto workOrder = new ProductWorkOrderDto();
- workOrder.setPlanStartTime(LocalDate.now().minusMonths(1));
- workOrder.setPlanEndTime(LocalDate.now());
+ workOrder.setPlanStartTime(LocalDateTime.now());
+ workOrder.setPlanEndTime(LocalDateTime.now());
List<ProductWorkOrderDto> productWorkOrders = productWorkOrderMapper
.pageProductWorkOrder(new Page<>(1, -1), workOrder).getRecords();
long sum = productWorkOrders.stream()
@@ -1589,30 +1589,31 @@
@Override
public List<MapDto> processOutputAnalysis(Integer type) {
- LocalDate today = LocalDate.now();
- LocalDate startDate;
- LocalDate endDate = today;
+ // 鑾峰彇褰撳墠鏃堕棿鐐�
+ LocalDateTime now = LocalDateTime.now();
+ LocalDateTime startDateTime;
+ LocalDateTime endDateTime = now.with(LocalTime.MAX);
switch (type) {
case 1: // 鍛�
- startDate = today.with(DayOfWeek.MONDAY);
+ startDateTime = now.with(DayOfWeek.MONDAY).with(LocalTime.MIN);
break;
case 2: // 鏈�
- startDate = today.withDayOfMonth(1);
+ startDateTime = now.withDayOfMonth(1).with(LocalTime.MIN);
break;
case 3: // 瀛e害
- int currentMonth = today.getMonthValue();
+ int currentMonth = now.getMonthValue();
int startMonth = ((currentMonth - 1) / 3) * 3 + 1;
- startDate = LocalDate.of(today.getYear(), startMonth, 1);
+ startDateTime = LocalDateTime.of(now.getYear(), startMonth, 1, 0, 0, 0);
break;
default:
- startDate = today.with(DayOfWeek.MONDAY);
+ startDateTime = now.with(DayOfWeek.MONDAY).with(LocalTime.MIN);
break;
}
ProductWorkOrderDto queryDto = new ProductWorkOrderDto();
- queryDto.setPlanStartTime(startDate);
- queryDto.setPlanEndTime(endDate);
+ queryDto.setPlanStartTime(startDateTime);
+ queryDto.setPlanEndTime(endDateTime);
List<ProductWorkOrderDto> list = productWorkOrderMapper.pageProductWorkOrder(new Page<>(1, -1), queryDto)
.getRecords();
@@ -1632,7 +1633,7 @@
BigDecimal total = processOutputMap.values().stream()
.reduce(BigDecimal.ZERO, BigDecimal::add);
- if (BigDecimal.ZERO.compareTo(total) == 0) {
+ if (total.compareTo(BigDecimal.ZERO) == 0) {
return new ArrayList<>();
}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java b/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
index 6e2ca95..8a88b2b 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -1,14 +1,12 @@
package com.ruoyi.production.dto;
-import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.production.pojo.ProductWorkOrder;
-import com.ruoyi.production.pojo.ProductWorkOrderFile;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
-import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
@@ -43,4 +41,17 @@
@ApiModelProperty(value = "宸ュ崟绫诲瀷 姝e父 /杩斿伐杩斾慨")
private String workOrderType;
+
+ @ApiModelProperty("璁″垝宸ユ椂")
+ private BigDecimal salaryQuota;
+
+ @ApiModelProperty("鎶ュ伐浜篒D")
+ private Long[] reportWorkersId;
+
+ @ApiModelProperty("1-鐢熶骇宸ュ崟,2-鐢熶骇鎶ュ伐")
+ @TableField(exist = false)
+ private Integer type;
+
+ @TableField(exist = false)
+ private Long currentUserId;
}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderRapporteurMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderRapporteurMapper.java
new file mode 100644
index 0000000..e2bae3b
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderRapporteurMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.production.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.production.pojo.ProductWorkOrderRapporteur;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ProductWorkOrderRapporteurMapper extends BaseMapper<ProductWorkOrderRapporteur> {
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
index bbfb332..024a6c9 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
@@ -2,14 +2,12 @@
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
-import java.time.LocalDate;
import java.time.LocalDateTime;
/**
@@ -81,33 +79,33 @@
* 璁″垝寮�濮嬫椂闂�
*/
@ApiModelProperty(value = "璁″垝寮�濮嬫椂闂�")
- @JsonFormat(pattern = "yyyy-MM-dd")
- @DateTimeFormat(pattern = "yyyy-MM-dd")
- private LocalDate planStartTime;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime planStartTime;
/**
* 璁″垝缁撴潫鏃堕棿
*/
@ApiModelProperty(value = "璁″垝缁撴潫鏃堕棿")
- @JsonFormat(pattern = "yyyy-MM-dd")
- @DateTimeFormat(pattern = "yyyy-MM-dd")
- private LocalDate planEndTime;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime planEndTime;
/**
* 瀹為檯寮�濮嬫椂闂�
*/
@ApiModelProperty(value = "瀹為檯寮�濮嬫椂闂�")
- @JsonFormat(pattern = "yyyy-MM-dd")
- @DateTimeFormat(pattern = "yyyy-MM-dd")
- private LocalDate actualStartTime;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime actualStartTime;
/**
* 瀹為檯缁撴潫鏃堕棿
*/
@ApiModelProperty(value = "瀹為檯缁撴潫鏃堕棿")
- @JsonFormat(pattern = "yyyy-MM-dd")
- @DateTimeFormat(pattern = "yyyy-MM-dd")
- private LocalDate actualEndTime;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime actualEndTime;
/**
* 闇�姹傞噺
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrderRapporteur.java b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrderRapporteur.java
new file mode 100644
index 0000000..ea8207b
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrderRapporteur.java
@@ -0,0 +1,54 @@
+package com.ruoyi.production.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 浜у搧宸ュ崟-鎶ュ伐浜哄叧鑱�
+ */
+@Data
+@TableName("product_work_order_rapporteur")
+public class ProductWorkOrderRapporteur implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ @ApiModelProperty("宸ュ崟ID")
+ private Long workOrderId;
+
+ @ApiModelProperty("鎶ュ憡浜篒D")
+ private Long userId;
+
+ @ApiModelProperty("鍒涘缓鏃堕棿")
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("鍒涘缓鐢ㄦ埛")
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty("淇敼鏃堕棿")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty("淇敼鐢ㄦ埛")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+
+ @ApiModelProperty("绉熸埛ID")
+ @TableField(fill = FieldFill.INSERT)
+ private Long tenantId;
+
+ @TableField(fill = FieldFill.INSERT)
+ private Long deptId;
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
index d742268..60f5788 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
@@ -25,7 +25,6 @@
import com.ruoyi.production.service.ProductProcessService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
-import com.ruoyi.project.system.service.ISysUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -37,6 +36,7 @@
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
+import java.util.stream.Collectors;
@Slf4j
@Service
@@ -91,6 +91,7 @@
if (productModel == null) {
throw new ServiceException("鏂板澶辫触,璇ラ儴浠朵笉瀛樺湪");
}
+ validateDuplicateTypeForSameProduct(productModel.getId(), productProcessDto.getType(), null);
ProductProcess productProcess = new ProductProcess();
BeanUtils.copyProperties(productProcessDto, productProcess);
@@ -109,6 +110,9 @@
@Override
@Transactional(rollbackFor = Exception.class)
public void update(ProductProcessDto productProcessDto) {
+ if (ObjectUtils.isEmpty(productProcessDto.getId())) {
+ throw new ServiceException("淇敼澶辫触锛屽伐搴廔D涓嶈兘涓虹┖");
+ }
if (ObjectUtils.isEmpty(productProcessDto.getName())) {
throw new ServiceException("閮ㄤ欢鍚嶇О涓嶈兘涓虹┖");
}
@@ -121,13 +125,21 @@
}
}
- // 鍒ゆ柇鍏宠仈浜у搧鏄惁瀛樺湪
- if (ObjectUtils.isNotEmpty(productProcessDto.getProductModelId())) {
- ProductModel productModel = productModelService.getById(productProcessDto.getProductModelId());
- if (productModel == null) {
- throw new ServiceException("淇敼澶辫触锛屽叧鑱旈儴浠朵笉瀛樺湪");
- }
+ ProductProcess oldProductProcess = this.getById(productProcessDto.getId());
+ if (oldProductProcess == null) {
+ throw new ServiceException("淇敼澶辫触锛屽伐搴忎笉瀛樺湪");
}
+ Long finalProductModelId = ObjectUtils.isNotEmpty(productProcessDto.getProductModelId())
+ ? productProcessDto.getProductModelId() : oldProductProcess.getProductModelId();
+ Integer finalType = ObjectUtils.isNotEmpty(productProcessDto.getType())
+ ? productProcessDto.getType() : oldProductProcess.getType();
+
+ // 鍒ゆ柇鍏宠仈浜у搧鏄惁瀛樺湪
+ ProductModel productModel = productModelService.getById(finalProductModelId);
+ if (productModel == null) {
+ throw new ServiceException("淇敼澶辫触锛屽叧鑱旈儴浠朵笉瀛樺湪");
+ }
+ validateDuplicateTypeForSameProduct(productModel.getId(), finalType, productProcessDto.getId());
// 鏍¢獙璁″垝浜哄憳
validatePlanner(productProcessDto.getPlannerId(), productProcessDto.getPlannerName(), null);
@@ -232,6 +244,34 @@
}
}
+ /**
+ * 鏍¢獙鍚屼竴浜у搧涓嬪伐搴忕被鍨嬩笉鑳介噸澶�
+ */
+ private void validateDuplicateTypeForSameProduct(Long productModelId, Integer type, Long excludeId) {
+ if (productModelId == null || type == null) {
+ return;
+ }
+ ProductModel currentModel = productModelService.getById(productModelId);
+ if (currentModel == null || currentModel.getProductId() == null) {
+ return;
+ }
+ List<ProductModel> productModels = productModelService.list(
+ Wrappers.<ProductModel>lambdaQuery().eq(ProductModel::getProductId, currentModel.getProductId()));
+ if (CollectionUtils.isEmpty(productModels)) {
+ return;
+ }
+ List<Long> productModelIds = productModels.stream().map(ProductModel::getId).collect(Collectors.toList());
+ LambdaQueryWrapper<ProductProcess> queryWrapper = Wrappers.<ProductProcess>lambdaQuery()
+ .in(ProductProcess::getProductModelId, productModelIds)
+ .eq(ProductProcess::getType, type);
+ if (excludeId != null) {
+ queryWrapper.ne(ProductProcess::getId, excludeId);
+ }
+ if (this.count(queryWrapper) > 0) {
+ throw new ServiceException("鎿嶄綔澶辫触锛屽悓涓�浜у搧涓嶈兘瀛樺湪閲嶅鐨勯儴浠剁被鍨�");
+ }
+ }
+
@Override
@Transactional(rollbackFor = Exception.class)
public void batchDelete(List<Integer> ids) {
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
index 4a68ce8..a137d8d 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -7,19 +7,21 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
-import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.Pictures;
-import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
+import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.MatrixToImageWriter;
+import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.production.dto.ProductWorkOrderDto;
import com.ruoyi.production.mapper.ProductWorkOrderFileMapper;
import com.ruoyi.production.mapper.ProductWorkOrderMapper;
+import com.ruoyi.production.mapper.ProductWorkOrderRapporteurMapper;
import com.ruoyi.production.pojo.ProductWorkOrder;
import com.ruoyi.production.pojo.ProductWorkOrderFile;
+import com.ruoyi.production.pojo.ProductWorkOrderRapporteur;
import com.ruoyi.production.service.ProductWorkOrderService;
-import com.ruoyi.quality.pojo.QualityInspectParam;
-import lombok.AllArgsConstructor;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -30,9 +32,13 @@
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
@Service
@Transactional(rollbackFor = Exception.class)
@@ -42,18 +48,100 @@
private ProductWorkOrderMapper productWorkOrdermapper;
@Autowired
private ProductWorkOrderFileMapper productWorkOrderFileMapper;
+ @Autowired
+ private ProductWorkOrderRapporteurMapper productWorkOrderRapporteurMapper;
+ @Autowired
+ private SysUserMapper sysUserMapper;
@Value("${file.temp-dir}")
private String tempDir;
@Override
public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
- return productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder);
+ if (productWorkOrder != null && Integer.valueOf(2).equals(productWorkOrder.getType())) {
+ productWorkOrder.setCurrentUserId(SecurityUtils.getUserId());
+ }
+ IPage<ProductWorkOrderDto> pageData = productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder);
+ List<ProductWorkOrderDto> records = pageData.getRecords();
+ if (CollectionUtils.isEmpty(records)) {
+ return pageData;
+ }
+
+ List<Long> workOrderIds = records.stream()
+ .map(ProductWorkOrderDto::getId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(workOrderIds)) {
+ return pageData;
+ }
+
+ List<ProductWorkOrderRapporteur> rapporteurs = productWorkOrderRapporteurMapper.selectList(Wrappers.<ProductWorkOrderRapporteur>lambdaQuery()
+ .in(ProductWorkOrderRapporteur::getWorkOrderId, workOrderIds));
+
+ final Map<Long, List<Long>> rapporteurMap = CollectionUtils.isNotEmpty(rapporteurs)
+ ? rapporteurs.stream()
+ .filter(item -> item.getWorkOrderId() != null && item.getUserId() != null)
+ .collect(Collectors.groupingBy(
+ ProductWorkOrderRapporteur::getWorkOrderId,
+ LinkedHashMap::new,
+ Collectors.mapping(ProductWorkOrderRapporteur::getUserId, Collectors.toList())
+ ))
+ : new LinkedHashMap<>();
+
+ records.forEach(item -> {
+ List<Long> userIds = rapporteurMap.get(item.getId());
+ item.setReportWorkersId(userIds == null ? new Long[0] : userIds.toArray(new Long[0]));
+ });
+ return pageData;
}
@Override
public int updateProductWorkOrder(ProductWorkOrderDto productWorkOrderDto) {
- return productWorkOrdermapper.updateById(productWorkOrderDto);
+ int rows = productWorkOrdermapper.updateById(productWorkOrderDto);
+ if (rows <= 0 || productWorkOrderDto.getId() == null) {
+ return rows;
+ }
+
+ productWorkOrderRapporteurMapper.delete(Wrappers.<ProductWorkOrderRapporteur>lambdaQuery()
+ .eq(ProductWorkOrderRapporteur::getWorkOrderId, productWorkOrderDto.getId()));
+
+ Long[] rapporteurIds = productWorkOrderDto.getReportWorkersId();
+ if (rapporteurIds == null || rapporteurIds.length == 0) {
+ return rows;
+ }
+
+ List<Long> candidateUserIds = Arrays.stream(rapporteurIds)
+ .filter(Objects::nonNull)
+ .distinct()
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(candidateUserIds)) {
+ return rows;
+ }
+
+ List<Long> existUserIds = sysUserMapper.selectUserByIds(candidateUserIds).stream()
+ .map(SysUser::getUserId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ if (existUserIds.size() != candidateUserIds.size()) {
+ List<Long> invalidUserIds = candidateUserIds.stream()
+ .filter(id -> !existUserIds.contains(id))
+ .collect(Collectors.toList());
+ throw new ServiceException("鎶ュ伐浜轰笉瀛樺湪: " + invalidUserIds);
+ }
+
+ List<ProductWorkOrderRapporteur> rapporteurList = candidateUserIds.stream()
+ .map(userId -> {
+ ProductWorkOrderRapporteur rapporteur = new ProductWorkOrderRapporteur();
+ rapporteur.setWorkOrderId(productWorkOrderDto.getId());
+ rapporteur.setUserId(userId);
+ return rapporteur;
+ })
+ .collect(Collectors.toList());
+
+ if (!rapporteurList.isEmpty()) {
+ rapporteurList.forEach(productWorkOrderRapporteurMapper::insert);
+ }
+ return rows;
}
@Override
@@ -71,7 +159,7 @@
if (CollectionUtils.isNotEmpty(productWorkOrderFiles)) {
productWorkOrderFiles.forEach(productWorkOrderFile -> {
Map<String, Object> image = new HashMap<>();
- PictureRenderData pictureRenderData = Pictures.ofLocal( productWorkOrderFile.getUrl()).sizeInCm(17, 20).create();
+ PictureRenderData pictureRenderData = Pictures.ofLocal(productWorkOrderFile.getUrl()).sizeInCm(17, 20).create();
image.put("url", pictureRenderData);
images.add(image);
});
@@ -92,7 +180,7 @@
put("actualStartTime", productWorkOrderDto.getActualStartTime());
put("actualEndTime", productWorkOrderDto.getActualEndTime());
put("twoCode", Pictures.ofLocal(codePath).create());
- put("images", images.isEmpty()?null:images);
+ put("images", images.isEmpty() ? null : images);
}});
try {
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index fa34114..7ae9771 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -215,10 +215,10 @@
ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(productQty));
if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) {
- productWorkOrder.setActualStartTime(LocalDate.now());//瀹為檯寮�濮嬫椂闂�
+ productWorkOrder.setActualStartTime(LocalDateTime.now());//瀹為檯寮�濮嬫椂闂�
}
if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0) {
- productWorkOrder.setActualEndTime(LocalDate.now());//瀹為檯缁撴潫鏃堕棿
+ productWorkOrder.setActualEndTime(LocalDateTime.now());//瀹為檯缁撴潫鏃堕棿
}
productWorkOrderMapper.updateById(productWorkOrder);
//鐢熶骇璁㈠崟
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
index 14b883e..e132174 100644
--- a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -12,10 +12,10 @@
<result column="work_order_no" property="workOrderNo"/>
<result column="status" property="status"/>
<result column="tenant_id" property="tenantId"/>
- <result column="actual_end_time" property="planStartTime"/>
+ <result column="plan_start_time" property="planStartTime"/>
<result column="plan_end_time" property="planEndTime"/>
<result column="actual_start_time" property="actualStartTime"/>
- <result column="actualEndTime" property="actualEndTime"/>
+ <result column="actual_end_time" property="actualEndTime"/>
</resultMap>
<select id="pageProductWorkOrder" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
@@ -26,6 +26,7 @@
pm.unit,
p.product_name AS productName,
po.nps_no AS productOrderNpsNo,
+ pp.salary_quota,
ROUND(pwo.complete_quantity / pwo.plan_quantity * 100, 2) AS completionStatus,
CASE
WHEN pwo.work_order_no LIKE 'FG%' THEN '杩斿伐杩斾慨'
@@ -43,11 +44,20 @@
and pwo.work_order_no like concat('%',#{c.workOrderNo},'%')
</if>
<if test="c.planStartTime != null and c.planEndTime != null">
- and DATE(pwo.create_time) between #{c.planStartTime} and #{c.planEndTime}
+ and pwo.create_time <![CDATA[ >= ]]> #{c.planStartTime}
+ and pwo.create_time <![CDATA[ <= ]]> #{c.planEndTime}
</if>
<if test="c.productOrderId != null and c.productOrderId != ''">
and pwo.product_order_id = #{c.productOrderId}
</if>
+ <if test="c.type != null and c.type == 2 and c.currentUserId != null">
+ and exists (
+ select 1
+ from product_work_order_rapporteur pwor
+ where pwor.work_order_id = pwo.id
+ and pwor.user_id = #{c.currentUserId}
+ )
+ </if>
</select>
<select id="getProductWorkOrderFlowCard" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
SELECT
--
Gitblit v1.9.3