doc/20260427_alter_production_product_main_add_report_duration.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,4 @@ alter table production_product_main add column report_start_time datetime null comment 'æ¥å·¥å¼å§æ¶é´' after status, add column report_end_time datetime null comment 'æ¥å·¥ç»ææ¶é´' after report_start_time, add column report_duration_minutes decimal(16,2) null comment 'å®é æ¥å·¥æ¶é¿(åé)' after report_end_time; doc/20260427_alter_report_duration_minutes_to_decimal.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,5 @@ alter table production_product_main modify column report_duration_minutes decimal(16,2) null comment 'å®é æ¥å·¥æ¶é¿(åé)'; alter table production_product_report_daily modify column duration_minutes decimal(16,2) not null comment '彿¥æ¶é¿(åé)'; doc/20260427_create_table_production_product_report_daily.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ drop table if exists production_product_report_daily; create table production_product_report_daily ( id bigint auto_increment primary key, product_main_id bigint not null comment 'æ¥å·¥ä¸»è¡¨ID', work_order_id bigint not null comment 'å·¥åID', product_process_route_item_id bigint not null comment 'å·¥èºè·¯çº¿é¡¹ç®ID', user_id bigint not null comment 'æ¥å·¥äººID', report_date date not null comment 'æ¥å·¥æ¥æ(æå¤©ç»è®¡)', start_time datetime not null comment '彿¥å¼å§æ¶é´', end_time datetime not null comment '彿¥ç»ææ¶é´', duration_minutes decimal(16,2) not null comment '彿¥æ¶é¿(åé)', 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', key idx_product_main_id (product_main_id), key idx_work_order_user_date (work_order_id, user_id, report_date), key idx_user_date (user_id, report_date) ) comment 'ç产æ¥å·¥-æ¯æ¥æ¶é¿æç»'; src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
@@ -36,7 +36,7 @@ @PostMapping ("/updateProductWorkOrder") public R updateProductWorkOrder(@RequestBody ProductWorkOrderDto productWorkOrderDto) { return R.ok(productWorkOrderservice.updateProductWorkOrder(productWorkOrderDto)); } } /** * pdaæ ¹æ®äºç»´ç çå·¥åidæ¥è¯¢æ°æ® src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
@@ -3,18 +3,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.domain.R; import com.ruoyi.production.dto.ProductProcessRouteItemDto; import com.ruoyi.production.dto.ProductionProductMainDto; import com.ruoyi.production.dto.SalesLedgerProductionAccountingDto; import com.ruoyi.production.dto.ProductionReportDailySummaryDto; import com.ruoyi.production.dto.ProductionReportStateDto; import com.ruoyi.production.pojo.ProductionProductMain; import com.ruoyi.production.service.ProductionProductMainService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.Arrays; import java.time.LocalDate; import java.util.List; @RequestMapping("productionProductMain") @@ -31,9 +33,48 @@ * @param productionProductMainDto * @return */ @ApiOperation("æ¥å·¥å°è´¦æ±æ»å页(å½åç»å½äºº)") @ApiImplicitParams({ @ApiImplicitParam(name = "current", value = "页ç ", dataType = "long", paramType = "query"), @ApiImplicitParam(name = "size", value = "æ¯é¡µæ°é", dataType = "long", paramType = "query"), @ApiImplicitParam(name = "workOrderNo", value = "å·¥åç¼å·(模ç³)", dataType = "string", paramType = "query"), @ApiImplicitParam(name = "workOrderStatus", value = "å·¥åç¶æ", dataType = "string", paramType = "query") }) @GetMapping("listPage") public R page(Page<ProductionProductMainDto> page, ProductionProductMainDto productionProductMainDto) { public R<?> page(Page<ProductionProductMainDto> page, ProductionProductMainDto productionProductMainDto) { return R.ok(productionProductMainService.listPageProductionProductMainDto(page, productionProductMainDto)); } /** * æ¥å·¥æç»æ¥è¯¢(æ¯æ¡æ¥å·¥è®°å½) */ @ApiOperation("æ¥å·¥æç»å页(æ¯æ¡æ¥å·¥è®°å½, å½åç»å½äºº)") @ApiImplicitParams({ @ApiImplicitParam(name = "current", value = "页ç ", dataType = "long", paramType = "query"), @ApiImplicitParam(name = "size", value = "æ¯é¡µæ°é", dataType = "long", paramType = "query"), @ApiImplicitParam(name = "workOrderId", value = "å·¥åID(å»ºè®®å¿ ä¼ )", dataType = "long", paramType = "query"), @ApiImplicitParam(name = "startDate", value = "å¼å§æ¥æ(æç»ææ¶é´è¿æ»¤, yyyy-MM-dd)", dataType = "string", paramType = "query"), @ApiImplicitParam(name = "endDate", value = "ç»ææ¥æ(æç»ææ¶é´è¿æ»¤, yyyy-MM-dd)", dataType = "string", paramType = "query") }) @GetMapping("listPageDetail") public R<?> pageDetail(Page<ProductionProductMainDto> page, ProductionProductMainDto productionProductMainDto) { return R.ok(productionProductMainService.listPageProductionProductMainDetailDto(page, productionProductMainDto)); } /** * æ¥å·¥æç»æ±æ»(æ¯ä¸ªäººåæ¯å¤©) */ @ApiOperation("æ¥å·¥æ¯æ¥æ±æ»å页(æ¯äººæ¯å¤©, å½åç»å½äºº)") @ApiImplicitParams({ @ApiImplicitParam(name = "current", value = "页ç ", dataType = "long", paramType = "query"), @ApiImplicitParam(name = "size", value = "æ¯é¡µæ°é", dataType = "long", paramType = "query"), @ApiImplicitParam(name = "workOrderId", value = "å·¥åID(å»ºè®®å¿ ä¼ )", dataType = "long", paramType = "query"), @ApiImplicitParam(name = "startDate", value = "å¼å§æ¥æ(report_date, yyyy-MM-dd)", dataType = "string", paramType = "query"), @ApiImplicitParam(name = "endDate", value = "ç»ææ¥æ(report_date, yyyy-MM-dd)", dataType = "string", paramType = "query") }) @GetMapping("listPageDaily") public R<?> pageDaily(Page<ProductionProductMainDto> page, ProductionProductMainDto productionProductMainDto) { return R.ok(productionProductMainService.listPageProductionProductMainDailyDto(page, productionProductMainDto)); } /** @@ -42,13 +83,41 @@ * @return */ @PostMapping("addProductMain") public R addProductMain(@RequestBody ProductionProductMainDto productionProductMainDto) { public R<?> addProductMain(@RequestBody ProductionProductMainDto productionProductMainDto) { return R.ok(productionProductMainService.addProductMain(productionProductMainDto)); } /** * æ«ç åæ¥è¯¢å½åç¨æ·æ¯å¦åå¨è¿è¡ä¸çæ¥å·¥ */ @ApiOperation("æ¥è¯¢è¿è¡ä¸çæ¥å·¥(å½åç»å½äºº)") @GetMapping("getRunning") public R<ProductionProductMain> getRunning(Long workOrderId, Long productProcessRouteItemId) { ProductionProductMain productionProductMain = productionProductMainService.getRunning(workOrderId, productProcessRouteItemId); return R.ok(productionProductMain); } /** * æ¯æ¥æ¥å·¥æ¶é¿æ±æ»(å½åç»å½äºº) */ @ApiOperation("æ¯æ¥æ¥å·¥æ¶é¿æ±æ»(å½åç»å½äºº)") @GetMapping("dailyDuration") public R<List<ProductionReportDailySummaryDto>> dailyDuration(Long workOrderId, Long productProcessRouteItemId, LocalDate startDate, LocalDate endDate) { return R.ok(productionProductMainService.dailyDuration(workOrderId, productProcessRouteItemId, startDate, endDate)); } /** * æ¥è¯¢æ¥å·¥ç¶æ: 1-å¼å§æ¥å·¥ 2-ç»ææ¥å·¥ */ @ApiOperation("æ¥è¯¢æ¥å·¥ç¶æ(å½åç»å½äºº)") @GetMapping("reportState") public R<ProductionReportStateDto> reportState(Long workOrderId, Long productProcessRouteItemId) { return R.ok(productionProductMainService.reportState(workOrderId, productProcessRouteItemId)); } @ApiOperation("å 餿¥å·¥") @DeleteMapping("/delete") public R delete(@RequestBody ProductionProductMainDto productionProductMainDto) { public R<?> delete(@RequestBody ProductionProductMainDto productionProductMainDto) { return R.ok(productionProductMainService.removeProductMain(productionProductMainDto.getId())); } src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.ruoyi.production.pojo.ProductWorkOrder; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -10,6 +11,7 @@ @EqualsAndHashCode(callSuper = true) @Data @ApiModel(value = "ProductWorkOrderDto", description = "产åå·¥åå页/æ¥å·¥è§è§è¿å DTO") public class ProductWorkOrderDto extends ProductWorkOrder { //产ååç§° @@ -54,4 +56,15 @@ @TableField(exist = false) private Long currentUserId; /** * 仿¥æ¥å·¥ç¶æ(ä» type=2 æ¶åå¡«)ï¼1-æªå¼å§ 2-å·²å¼å§(è¿è¡ä¸) 3-å·²ç»æ */ @ApiModelProperty("仿¥æ¥å·¥ç¶æ(1-æªå¼å§ 2-å·²å¼å§ 3-å·²ç»æ)") @TableField(exist = false) private Integer todayReportState; @ApiModelProperty("æ¥å·¥æ¶é´æ»å(åé)") @TableField(exist = false) private BigDecimal totalReportDurationMinutes; } src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
@@ -4,16 +4,19 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.ruoyi.production.pojo.ProductionProductMain; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; @Data @EqualsAndHashCode(callSuper = true) @ExcelIgnoreUnannotated @ApiModel(value = "ProductionProductMainDto", description = "ç产æ¥å·¥å°è´¦/æç» DTO") public class ProductionProductMainDto extends ProductionProductMain { @ApiModelProperty(value = "å·¥åç¼å·") @Excel(name = "å·¥åç¼å·") @@ -50,8 +53,19 @@ @Excel(name = "éå®ååå·") private String salesContractNo; @ApiModelProperty(value = "ç产订åå·") @Excel(name = "ç产订åå·") private String productOrderNpsNo; @ApiModelProperty(value = "å¼å§æ¥æ(æç»æ¥è¯¢ç¨)") private LocalDate startDate; @ApiModelProperty(value = "ç»ææ¥æ(æç»æ¥è¯¢ç¨)") private LocalDate endDate; @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "æ¥æ(æç»/æ±æ»ä¸ä½¿ç¨)") private LocalDate schedulingDate; private String schedulingUserName; private String customerName; @@ -61,5 +75,30 @@ private BigDecimal workHours; private BigDecimal wages; @ApiModelProperty(value = "æ¥å·¥å¨ä½ 1-å¼å§ 2-ç»æ") private Integer actionType; @ApiModelProperty(value = "å®é æ¥å·¥æ¶é¿(åé)") @Excel(name = "å®é æ¥å·¥æ¶é¿(åé)") private BigDecimal reportDurationMinutes; @ApiModelProperty(value = "é¡¹ç®æ»å·¥æ¶(å°æ¶)") private BigDecimal projectTotalHours; @ApiModelProperty(value = "å·¥åºæ åå·¥æ¶(å°æ¶)") private BigDecimal processStandardHours; @ApiModelProperty(value = "å®é æ¥å·¥å·¥æ¶(å°æ¶)") private BigDecimal actualReportHours; @ApiModelProperty(value = "æ¯æ¥äººåå·¥æ¶(å°æ¶)") private BigDecimal dailyPersonHours; @ApiModelProperty(value = "äº§åºæ»æ°é") private BigDecimal outputTotalQuantity; @ApiModelProperty(value = "æ¥åºæ»æ°é") private BigDecimal scrapTotalQuantity; } src/main/java/com/ruoyi/production/dto/ProductionReportDailySummaryDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ package com.ruoyi.production.dto; import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModel; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDate; @Data @ApiModel(value = "ProductionReportDailySummaryDto", description = "æ¯æ¥æ¥å·¥æ¶é¿æ±æ»è¿å") public class ProductionReportDailySummaryDto { @ApiModelProperty("æ¥æ") private LocalDate reportDate; @ApiModelProperty("æ¶é¿(åé)") private BigDecimal durationMinutes; } src/main/java/com/ruoyi/production/dto/ProductionReportStateDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.production.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; @Data @ApiModel("ProductionReportStateDto") public class ProductionReportStateDto { @ApiModelProperty("ç¶æ: 1-å¼å§æ¥å·¥ 2-ç»ææ¥å·¥") private Integer state; @ApiModelProperty("è¿è¡ä¸çæ¥å·¥ID") private Long runningId; @ApiModelProperty("å¼å§æ¶é´") private LocalDateTime startTime; } src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
@@ -3,7 +3,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.production.dto.ProductBomDto; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.pojo.ProcessRoute; @@ -11,12 +10,13 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; import java.util.List; @Mapper public interface ProductOrderMapper extends BaseMapper<ProductOrder> { IPage<ProductOrderDto> pageProductOrder(Page page, @Param("c") ProductOrderDto productOrder); IPage<ProductOrderDto> pageProductOrder(Page<ProductOrderDto> page, @Param("c") ProductOrderDto productOrder); List<ProcessRoute> listProcessRoute(@Param("productModelId") Long productModelId); @@ -27,4 +27,10 @@ Integer countCompleted(@Param("startDate") String startDate, @Param("endDate") String endDate); Integer countPending(@Param("startDate") String startDate, @Param("endDate") String endDate); /** * ååå¢å 宿æ°éï¼é²æ¢å¹¶åè¶ åºè®¢åæ°é * @return å½±åè¡æ°(1 æåï¼0 失败) */ int addCompleteQtyIfNotExceed(@Param("id") Long id, @Param("delta") BigDecimal delta); } src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
@@ -1,6 +1,5 @@ package com.ruoyi.production.mapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -9,8 +8,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; import java.util.List; import java.util.Map; @Mapper public interface ProductWorkOrderMapper extends BaseMapper<ProductWorkOrder> { @@ -22,4 +21,10 @@ List<ProductWorkOrderDto> selectWorkOrderStartStats(@Param("startDate") String startDate, @Param("endDate") String endDate); ProductWorkOrder selectMax(@Param("datePrefix") String datePrefix); /** * ååå¢å 宿æ°éï¼é²æ¢å¹¶åè¶ åºè®¡åæ°é * @return å½±åè¡æ°(1 æåï¼0 失败) */ int addCompleteQtyIfNotExceed(@Param("id") Long id, @Param("delta") BigDecimal delta); } src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java
@@ -16,7 +16,11 @@ @Mapper public interface ProductionProductMainMapper extends BaseMapper<ProductionProductMain> { IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page page, @Param("c") ProductionProductMainDto productionProductMainDto); IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page<ProductionProductMainDto> page, @Param("c") ProductionProductMainDto productionProductMainDto); IPage<ProductionProductMainDto> listPageProductionProductMainDetailDto(Page<ProductionProductMainDto> page, @Param("c") ProductionProductMainDto productionProductMainDto); IPage<ProductionProductMainDto> listPageProductionProductMainDailyDto(Page<ProductionProductMainDto> page, @Param("c") ProductionProductMainDto productionProductMainDto); /** * æ ¹æ®å·¥åIDæ¹éå é¤çäº§ä¸»è¡¨æ°æ® @@ -30,7 +34,7 @@ */ ProductOrder getOrderByMainId(@Param("productMainId") Long productMainId); IPage<ProductionProductMainDto> listProductionDetails(@Param("ew") SalesLedgerProductionAccountingDto salesLedgerProductionAccountingDto, Page page); IPage<ProductionProductMainDto> listProductionDetails(@Param("ew") SalesLedgerProductionAccountingDto salesLedgerProductionAccountingDto, Page<ProductionProductMainDto> page); ArrayList<Long> listMain(List<Long> idList); } src/main/java/com/ruoyi/production/mapper/ProductionProductReportDailyMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.production.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.production.dto.ProductionReportDailySummaryDto; import com.ruoyi.production.pojo.ProductionProductReportDaily; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.time.LocalDate; import java.util.List; @Mapper public interface ProductionProductReportDailyMapper extends BaseMapper<ProductionProductReportDaily> { List<ProductionReportDailySummaryDto> listDailySummary( @Param("workOrderId") Long workOrderId, @Param("productProcessRouteItemId") Long productProcessRouteItemId, @Param("userId") Long userId, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate ); } src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -7,6 +7,7 @@ import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @@ -35,6 +36,15 @@ @ApiModelProperty(value = "æ¥å·¥ç¶æ") private Integer status; @ApiModelProperty(value = "æ¥å·¥å¼å§æ¶é´") private LocalDateTime reportStartTime; @ApiModelProperty(value = "æ¥å·¥ç»ææ¶é´") private LocalDateTime reportEndTime; @ApiModelProperty(value = "å®é æ¥å·¥æ¶é¿(åé)") private BigDecimal reportDurationMinutes; @ApiModelProperty(value = "å建æ¶é´") @TableField(fill = FieldFill.INSERT) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") src/main/java/com/ruoyi/production/pojo/ProductionProductReportDaily.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,66 @@ 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.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; @Data @TableName("production_product_report_daily") public class ProductionProductReportDaily implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty("æ¥å·¥ä¸»è¡¨ID") private Long productMainId; @ApiModelProperty("å·¥åID") private Long workOrderId; @ApiModelProperty("å·¥èºè·¯çº¿é¡¹ç®ID") private Long productProcessRouteItemId; @ApiModelProperty("æ¥å·¥äººID") private Long userId; @ApiModelProperty("æ¥å·¥æ¥æ(æå¤©)") private LocalDate reportDate; @ApiModelProperty("彿¥å¼å§æ¶é´(çæ®µ)") private LocalDateTime startTime; @ApiModelProperty("彿¥ç»ææ¶é´(çæ®µ)") private LocalDateTime endTime; @ApiModelProperty("彿¥æ¶é¿(åé)") private BigDecimal durationMinutes; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT) private Integer createUser; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateUser; @TableField(fill = FieldFill.INSERT) private Long tenantId; @TableField(fill = FieldFill.INSERT) private Long deptId; } src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
@@ -4,16 +4,39 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.production.dto.ProductionProductMainDto; import com.ruoyi.production.dto.ProductionReportDailySummaryDto; import com.ruoyi.production.dto.ProductionReportStateDto; import com.ruoyi.production.pojo.ProductionProductMain; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; public interface ProductionProductMainService extends IService<ProductionProductMain> { IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page page, ProductionProductMainDto productionProductMainDto); IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page<ProductionProductMainDto> page, ProductionProductMainDto productionProductMainDto); IPage<ProductionProductMainDto> listPageProductionProductMainDetailDto(Page<ProductionProductMainDto> page, ProductionProductMainDto productionProductMainDto); IPage<ProductionProductMainDto> listPageProductionProductMainDailyDto(Page<ProductionProductMainDto> page, ProductionProductMainDto productionProductMainDto); Boolean addProductMain(ProductionProductMainDto productionProductMainDto); /** * æ¥è¯¢å½åç»å½äººè¿è¡ä¸çæ¥å·¥(åå·¥ååå·¥åº) */ ProductionProductMain getRunning(Long workOrderId, Long productProcessRouteItemId); /** * æ¯æ¥æ¥å·¥æ¶é¿æ±æ»(å½åç»å½äºº) */ List<ProductionReportDailySummaryDto> dailyDuration(Long workOrderId, Long productProcessRouteItemId, LocalDate startDate, LocalDate endDate); /** * æ¥è¯¢æ¥å·¥ç¶æ(å½åç»å½äºº) */ ProductionReportStateDto reportState(Long workOrderId, Long productProcessRouteItemId); Boolean removeProductMain(Long id); ArrayList<Long> listMain(List<Long> idList); src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -13,9 +13,13 @@ import com.ruoyi.common.utils.MatrixToImageWriter; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.production.dto.ProductWorkOrderDto; import com.ruoyi.production.mapper.ProductionProductMainMapper; import com.ruoyi.production.mapper.ProductionProductReportDailyMapper; import com.ruoyi.production.mapper.ProductWorkOrderFileMapper; import com.ruoyi.production.mapper.ProductWorkOrderMapper; import com.ruoyi.production.mapper.ProductWorkOrderRapporteurMapper; import com.ruoyi.production.pojo.ProductionProductMain; import com.ruoyi.production.pojo.ProductionProductReportDaily; import com.ruoyi.production.pojo.ProductWorkOrder; import com.ruoyi.production.pojo.ProductWorkOrderFile; import com.ruoyi.production.pojo.ProductWorkOrderRapporteur; @@ -30,7 +34,9 @@ import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.io.OutputStream; import java.math.BigDecimal; import java.net.URLEncoder; import java.time.LocalDate; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -39,6 +45,7 @@ import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @Service @Transactional(rollbackFor = Exception.class) @@ -52,14 +59,21 @@ private ProductWorkOrderRapporteurMapper productWorkOrderRapporteurMapper; @Autowired private SysUserMapper sysUserMapper; @Autowired private ProductionProductMainMapper productionProductMainMapper; @Autowired private ProductionProductReportDailyMapper productionProductReportDailyMapper; @Value("${file.temp-dir}") private String tempDir; @Override public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) { if (productWorkOrder != null && Integer.valueOf(2).equals(productWorkOrder.getType())) { productWorkOrder.setCurrentUserId(SecurityUtils.getUserId()); boolean reportView = productWorkOrder != null && Integer.valueOf(2).equals(productWorkOrder.getType()); Long currentUserId = null; if (reportView) { currentUserId = SecurityUtils.getUserId(); productWorkOrder.setCurrentUserId(currentUserId); } IPage<ProductWorkOrderDto> pageData = productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder); List<ProductWorkOrderDto> records = pageData.getRecords(); @@ -92,6 +106,81 @@ List<Long> userIds = rapporteurMap.get(item.getId()); item.setReportWorkersId(userIds == null ? new Long[0] : userIds.toArray(new Long[0])); }); // type=2 æ¶ï¼åå¡«âå½åæ¥å·¥äººä»æ¥ç¶æâ if (reportView && currentUserId != null) { // 1) è¿è¡ä¸(status=0)çæ¥å·¥ List<ProductionProductMain> runningList = productionProductMainMapper.selectList( Wrappers.<ProductionProductMain>lambdaQuery() .in(ProductionProductMain::getWorkOrderId, workOrderIds) .eq(ProductionProductMain::getUserId, currentUserId) .eq(ProductionProductMain::getStatus, 0) ); final java.util.Set<Long> runningWorkOrders = CollectionUtils.isNotEmpty(runningList) ? runningList.stream().map(ProductionProductMain::getWorkOrderId).filter(Objects::nonNull).collect(Collectors.toSet()) : java.util.Collections.emptySet(); // 2) 仿¥å·²ç»æï¼ä»æ¥æ daily æç»ï¼ LocalDate today = LocalDate.now(); List<ProductionProductReportDaily> todayDailyList = productionProductReportDailyMapper.selectList( Wrappers.<ProductionProductReportDaily>lambdaQuery() .in(ProductionProductReportDaily::getWorkOrderId, workOrderIds) .eq(ProductionProductReportDaily::getUserId, currentUserId) .eq(ProductionProductReportDaily::getReportDate, today) ); final java.util.Set<Long> endedTodayWorkOrders = CollectionUtils.isNotEmpty(todayDailyList) ? todayDailyList.stream().map(ProductionProductReportDaily::getWorkOrderId).filter(Objects::nonNull).collect(Collectors.toSet()) : java.util.Collections.emptySet(); records.forEach(item -> { Long woId = item.getId(); if (woId == null) { item.setTodayReportState(1); return; } if (runningWorkOrders.contains(woId)) { item.setTodayReportState(2); return; } if (endedTodayWorkOrders.contains(woId)) { item.setTodayReportState(3); return; } item.setTodayReportState(1); }); } // åå¡«æ¥å·¥æ¶é´æ»å(åé): type=2 æå½åç»å½äººæ±æ»ï¼å ¶ä»æå·¥åå ¨åæ±æ» QueryWrapper<ProductionProductReportDaily> totalDurationQw = new QueryWrapper<>(); totalDurationQw.select("work_order_id as workOrderId", "sum(duration_minutes) as totalMinutes") .in("work_order_id", workOrderIds) .groupBy("work_order_id"); if (reportView && currentUserId != null) { totalDurationQw.eq("user_id", currentUserId); } List<Map<String, Object>> durationRows = productionProductReportDailyMapper.selectMaps(totalDurationQw); Map<Long, BigDecimal> durationMap = new HashMap<>(); if (CollectionUtils.isNotEmpty(durationRows)) { for (Map<String, Object> row : durationRows) { Object workOrderObj = row.get("workOrderId"); if (workOrderObj == null) { workOrderObj = row.get("work_order_id"); } Object totalObj = row.get("totalMinutes"); if (totalObj == null) { totalObj = row.get("total_minutes"); } if (workOrderObj == null || totalObj == null) { continue; } Long woId = workOrderObj instanceof Number ? ((Number) workOrderObj).longValue() : Long.valueOf(workOrderObj.toString()); BigDecimal totalMinutes = totalObj instanceof BigDecimal ? (BigDecimal) totalObj : new BigDecimal(totalObj.toString()); durationMap.put(woId, totalMinutes); } } records.forEach(item -> item.setTotalReportDurationMinutes(durationMap.getOrDefault(item.getId(), BigDecimal.ZERO))); return pageData; } @@ -118,9 +207,10 @@ return rows; } List<Long> existUserIds = sysUserMapper.selectUserByIds(candidateUserIds).stream() List<Long> existUserIds = sysUserMapper.selectUsersByIds(candidateUserIds).stream() .map(SysUser::getUserId) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); if (existUserIds.size() != candidateUserIds.size()) { List<Long> invalidUserIds = candidateUserIds.stream() src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -15,10 +15,15 @@ import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.dto.ProductionProductMainDto; import com.ruoyi.production.dto.ProductionReportDailySummaryDto; import com.ruoyi.production.dto.ProductionReportStateDto; import com.ruoyi.production.enums.ProductProcessEnum; import com.ruoyi.production.mapper.ProductionProductReportDailyMapper; import com.ruoyi.production.pojo.ProductionProductReportDaily; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductionProductMainService; @@ -26,13 +31,14 @@ import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.quality.mapper.*; import com.ruoyi.quality.pojo.*; import com.ruoyi.quality.service.IQualityInspectService; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.ruoyi.production.mapper.ProductionProductMainMapper; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -46,8 +52,8 @@ @Transactional(rollbackFor = Exception.class) public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService { private IQualityInspectService qualityInspectService; private ProductionProductMainMapper productionProductMainMapper; private ProductionProductReportDailyMapper productionProductReportDailyMapper; private ProductWorkOrderMapper productWorkOrderMapper; @@ -56,25 +62,16 @@ private SysUserMapper userMapper; private ProductionProductOutputMapper productionProductOutputMapper; private ProductModelMapper productModelMapper; private ProductMapper productMapper; private ProductProcessMapper productProcessMapper; private QualityInspectMapper qualityInspectMapper; private QualityUnqualifiedMapper qualityUnqualifiedMapper; private ProductProcessMapper productProcessMapper; private ProductProcessRouteMapper productProcessRouteMapper; private ProductMapper productMapper; private QualityInspectParamMapper qualityInspectParamMapper; private QualityTestStandardParamMapper qualityTestStandardParamMapper; private QualityTestStandardMapper qualityTestStandardMapper; private QualityInspectParamMapper qualityInspectParamMapper; private ProductStructureMapper productStructureMapper; private ProductionProductInputMapper productionProductInputMapper; @@ -86,27 +83,162 @@ @Override public IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page page, ProductionProductMainDto productionProductMainDto) { return productionProductMainMapper.listPageProductionProductMainDto(page, productionProductMainDto); public IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page<ProductionProductMainDto> page, ProductionProductMainDto productionProductMainDto) { if (productionProductMainDto == null) { productionProductMainDto = new ProductionProductMainDto(); } // productionProductMainDto.setUserId(SecurityUtils.getUserId()); IPage<ProductionProductMainDto> result = productionProductMainMapper.listPageProductionProductMainDto(page, productionProductMainDto); fillHourDefaults(result.getRecords()); return result; } @Override public IPage<ProductionProductMainDto> listPageProductionProductMainDetailDto(Page<ProductionProductMainDto> page, ProductionProductMainDto productionProductMainDto) { if (productionProductMainDto == null) { productionProductMainDto = new ProductionProductMainDto(); } IPage<ProductionProductMainDto> result = productionProductMainMapper.listPageProductionProductMainDetailDto(page, productionProductMainDto); fillHourDefaults(result.getRecords()); return result; } @Override public IPage<ProductionProductMainDto> listPageProductionProductMainDailyDto(Page<ProductionProductMainDto> page, ProductionProductMainDto productionProductMainDto) { if (productionProductMainDto == null) { productionProductMainDto = new ProductionProductMainDto(); } IPage<ProductionProductMainDto> result = productionProductMainMapper.listPageProductionProductMainDailyDto(page, productionProductMainDto); fillHourDefaults(result.getRecords()); return result; } private void fillHourDefaults(List<ProductionProductMainDto> records) { if (records == null || records.isEmpty()) { return; } records.forEach(item -> { if (item.getProjectTotalHours() == null) { item.setProjectTotalHours(BigDecimal.ZERO); } if (item.getProcessStandardHours() == null) { item.setProcessStandardHours(BigDecimal.ZERO); } if (item.getActualReportHours() == null) { item.setActualReportHours(BigDecimal.ZERO); } if (item.getDailyPersonHours() == null) { item.setDailyPersonHours(BigDecimal.ZERO); } }); } @Override public Boolean addProductMain(ProductionProductMainDto dto) { SysUser user = userMapper.selectUserById(dto.getUserId()); ProductionProductMain productionProductMain = new ProductionProductMain(); //å½åå·¥èºè·¯çº¿å¯¹åºçå·¥åºè¯¦æ ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(dto.getProductProcessRouteItemId()); if (productProcessRouteItem == null) { throw new RuntimeException("å·¥èºè·¯çº¿é¡¹ä¸åå¨"); if (dto.getActionType() == null) { if (dto.getId() != null) { if (dto.getQuantity() == null || dto.getQuantity().compareTo(BigDecimal.ZERO) <= 0) { throw new ServiceException("ç»ææ¥å·¥å¤±è´¥: æ¬æ¬¡ç产æ°éå¿ é¡»å¤§äº0"); } return finishReport(dto); } Long workOrderId = dto.getWorkOrderId(); Long itemId = dto.getProductProcessRouteItemId(); if (workOrderId == null || itemId == null) { throw new ServiceException("å·¥åIDåå·¥èºè·¯çº¿é¡¹ç®IDä¸è½ä¸ºç©º"); } ProductionProductMain running = getRunning(workOrderId, itemId); if (running != null) { if (dto.getQuantity() == null || dto.getQuantity().compareTo(BigDecimal.ZERO) <= 0) { throw new ServiceException("ç»ææ¥å·¥å¤±è´¥: æ¬æ¬¡ç产æ°éå¿ é¡»å¤§äº0"); } dto.setId(running.getId()); return finishReport(dto); } return startReport(dto); } //å½åå ·ä½å·¥åº ProductProcess productProcess = productProcessMapper.selectById(productProcessRouteItem.getProcessId()); //å·¥èºè·¯çº¿ä¸å½åå·¥åºå¯¹åºç产åºè§æ ¼åå· ProductModel productModel = productModelMapper.selectById(productProcessRouteItem.getProductModelId()); //æ¥è¯¢è¯¥ç产订å对åºçbom ProductProcessRoute productProcessRoute = productProcessRouteMapper.selectById(productProcessRouteItem.getProductRouteId()); /*æ°å¢æ¥å·¥ä¸»è¡¨*/ //æ¥è¯¢æå¤§æ¥å·¥ç¼å· if (dto.getActionType() == 1) { return startReport(dto); } if (dto.getActionType() == 2) { return finishReport(dto); } throw new ServiceException("æ ææ¥å·¥å¨ä½: " + dto.getActionType()); } @Override public ProductionProductMain getRunning(Long workOrderId, Long productProcessRouteItemId) { if (workOrderId == null || productProcessRouteItemId == null) { throw new ServiceException("å·¥åIDåå·¥èºè·¯çº¿é¡¹ç®IDä¸è½ä¸ºç©º"); } Long currentUserId = SecurityUtils.getUserId(); return productionProductMainMapper.selectOne( Wrappers.<ProductionProductMain>lambdaQuery() .eq(ProductionProductMain::getWorkOrderId, workOrderId) .eq(ProductionProductMain::getProductProcessRouteItemId, productProcessRouteItemId) .eq(ProductionProductMain::getUserId, currentUserId) .eq(ProductionProductMain::getStatus, 0) .orderByDesc(ProductionProductMain::getReportStartTime) .last("limit 1") ); } @Override public List<ProductionReportDailySummaryDto> dailyDuration(Long workOrderId, Long productProcessRouteItemId, LocalDate startDate, LocalDate endDate) { Long userId = SecurityUtils.getUserId(); return productionProductReportDailyMapper.listDailySummary( workOrderId, productProcessRouteItemId, userId, startDate, endDate ); } @Override public ProductionReportStateDto reportState(Long workOrderId, Long productProcessRouteItemId) { ProductionProductMain running = getRunning(workOrderId, productProcessRouteItemId); ProductionReportStateDto dto = new ProductionReportStateDto(); if (running == null) { dto.setState(1); return dto; } dto.setState(2); dto.setRunningId(running.getId()); dto.setStartTime(running.getReportStartTime()); return dto; } private Boolean startReport(ProductionProductMainDto dto) { if (dto.getWorkOrderId() == null || dto.getProductProcessRouteItemId() == null) { throw new ServiceException("å¼å§æ¥å·¥å¤±è´¥: å·¥åIDåå·¥èºè·¯çº¿é¡¹ç®IDä¸è½ä¸ºç©º"); } if (dto.getUserId() == null) { dto.setUserId(SecurityUtils.getUserId()); } if (dto.getUserId() == null) { throw new ServiceException("å¼å§æ¥å·¥å¤±è´¥: æ æ³è·åå½åç»å½äºº"); } QueryWrapper<ProductionProductMain> runningWrapper = new QueryWrapper<>(); runningWrapper.eq("work_order_id", dto.getWorkOrderId()) .eq("product_process_route_item_id", dto.getProductProcessRouteItemId()) .eq("user_id", dto.getUserId()) .eq("status", 0); Long runningCount = productionProductMainMapper.selectCount(runningWrapper); if (runningCount != null && runningCount > 0) { // å·²æè¿è¡ä¸çæ¥å·¥æ¶ï¼ä¸åæ°å»ºï¼ç»§ç»æ²¿ç¨å°ç»ææ¥å·¥ return true; } SysUser user = userMapper.selectUserById(dto.getUserId()); if (user == null) { throw new ServiceException("æ¥å·¥äººä¸åå¨"); } ProductionProductMain productionProductMain = new ProductionProductMain(); String datePrefix = "BG" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyMMdd")); QueryWrapper<ProductionProductMain> queryWrapper = new QueryWrapper<>(); queryWrapper.select("MAX(product_no) as maxNo") @@ -134,110 +266,139 @@ String productNo = String.format("%s%03d", datePrefix, sequenceNumber); productionProductMain.setProductNo(productNo); productionProductMain.setUserId(dto.getUserId()); productionProductMain.setUserName(dto.getUserName()); productionProductMain.setUserName(user.getNickName()); productionProductMain.setProductProcessRouteItemId(dto.getProductProcessRouteItemId()); productionProductMain.setWorkOrderId(dto.getWorkOrderId()); productionProductMain.setStatus(0); productionProductMain.setReportStartTime(LocalDateTime.now()); productionProductMainMapper.insert(productionProductMain); /*æ°å¢æ¥å·¥æå ¥è¡¨*/ List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId()); if (productStructureDtos.size() == 0) { //å¦æè¯¥å·¥åºæ²¡æäº§åç»æçæå ¥å,é£è¿ä¸ªæå ¥åå产åºåæ¯åä¸ä¸ª ProductStructureDto productStructureDto = new ProductStructureDto(); productStructureDto.setProductModelId(productProcessRouteItem.getProductModelId()); productStructureDto.setUnitQuantity(BigDecimal.ONE); productStructureDtos.add(productStructureDto); } for (ProductStructureDto productStructureDto : productStructureDtos) { return true; } ProductionProductInput productionProductInput = new ProductionProductInput(); productionProductInput.setProductModelId(productStructureDto.getProductModelId()); productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())); productionProductInput.setProductMainId(productionProductMain.getId()); productionProductInputMapper.insert(productionProductInput); stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId()); private Boolean finishReport(ProductionProductMainDto dto) { if (dto.getId() == null) { throw new ServiceException("ç»ææ¥å·¥å¤±è´¥: æ¥å·¥IDä¸è½ä¸ºç©º"); } if (dto.getQuantity() == null || dto.getQuantity().compareTo(BigDecimal.ZERO) <= 0) { throw new ServiceException("ç»ææ¥å·¥å¤±è´¥: æ¬æ¬¡ç产æ°éå¿ é¡»å¤§äº0"); } ProductionProductMain productionProductMain = productionProductMainMapper.selectById(dto.getId()); if (productionProductMain == null) { throw new ServiceException("ç»ææ¥å·¥å¤±è´¥: æ¥å·¥è®°å½ä¸åå¨"); } if (productionProductMain.getStatus() != null && productionProductMain.getStatus() == 1) { throw new ServiceException("该æ¥å·¥å·²ç»æï¼è¯·å¿éå¤æäº¤"); } if (productionProductMain.getReportStartTime() == null) { throw new ServiceException("该æ¥å·¥ç¼ºå°å¼å§æ¶é´ï¼æ æ³ç»æ"); } LocalDateTime endTime = LocalDateTime.now(); long durationSeconds = Duration.between(productionProductMain.getReportStartTime(), endTime).getSeconds(); BigDecimal durationMinutes = secondsToMinutesExact(durationSeconds); int finishRows = productionProductMainMapper.update( null, Wrappers.<ProductionProductMain>lambdaUpdate() .set(ProductionProductMain::getReportEndTime, endTime) .set(ProductionProductMain::getReportDurationMinutes, durationMinutes) .set(ProductionProductMain::getStatus, 1) .eq(ProductionProductMain::getId, productionProductMain.getId()) .eq(ProductionProductMain::getStatus, 0) ); if (finishRows <= 0) { throw new ServiceException("该æ¥å·¥å·²ç»æï¼è¯·å¿éå¤æäº¤"); } productionProductMain.setReportEndTime(endTime); productionProductMain.setReportDurationMinutes(durationMinutes); productionProductMain.setStatus(1); // åå ¥âæ¯æ¥æ¶é¿æç»âï¼è·¨å¤©èªå¨æå saveDailyDurations(productionProductMain, productionProductMain.getReportStartTime(), endTime); dto.setWorkOrderId(productionProductMain.getWorkOrderId()); dto.setProductProcessRouteItemId(productionProductMain.getProductProcessRouteItemId()); if (dto.getUserId() == null) { dto.setUserId(productionProductMain.getUserId()); } if (dto.getUserName() == null) { dto.setUserName(productionProductMain.getUserName()); } if (dto.getScrapQty() == null) { dto.setScrapQty(BigDecimal.ZERO); } SysUser user = userMapper.selectUserById(dto.getUserId()); if (user == null) { throw new ServiceException("æ¥å·¥äººä¸åå¨"); } // 使ç¨å·¥åå ³èçç产订å产ååå· ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId()); if (productWorkOrder == null) { throw new ServiceException("ç»ææ¥å·¥å¤±è´¥: å·¥åä¸åå¨"); } ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId()); if (productOrder == null) { throw new ServiceException("ç»ææ¥å·¥å¤±è´¥: å ³èç产订åä¸åå¨"); } Long outputProductModelId = productOrder.getProductModelId(); if (outputProductModelId == null) { throw new ServiceException("ç»ææ¥å·¥å¤±è´¥: çäº§è®¢åæªé 置产ååå·"); } /*æ°å¢æ¥å·¥æå ¥è¡¨(æ BOMåºæ¯: æå ¥=产åºåå·, æ°éææ¬æ¬¡æ¥å·¥æ°é)*/ ProductionProductInput productionProductInput = new ProductionProductInput(); productionProductInput.setProductModelId(outputProductModelId); productionProductInput.setQuantity(dto.getQuantity()); productionProductInput.setProductMainId(productionProductMain.getId()); productionProductInputMapper.insert(productionProductInput); stockUtils.substractStock(outputProductModelId, dto.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId()); /*æ°å¢æ¥å·¥äº§åºè¡¨*/ ProductionProductOutput productionProductOutput = new ProductionProductOutput(); productionProductOutput.setProductMainId(productionProductMain.getId()); productionProductOutput.setProductModelId(productProcessRouteItem.getProductModelId()); productionProductOutput.setProductModelId(outputProductModelId); productionProductOutput.setQuantity(dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO); productionProductOutput.setScrapQty(dto.getScrapQty() != null ? dto.getScrapQty() : BigDecimal.ZERO); productionProductOutputMapper.insert(productionProductOutput); //åæ ¼æ°é=æ¥å·¥æ°é-æ¥åºæ°é BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty()); // æ¯å¦éè¦è´¨æ£ï¼æ product_process.is_quality 夿ï¼1-éè¦ï¼0-ä¸éè¦ï¼ boolean needQuality = isNeedQualityByWorkOrder(productWorkOrder); //åªæåæ ¼æ°é>0æè½å¢å ç¸åºæ°æ® if (productQty.compareTo(BigDecimal.ZERO) > 0) { /*æ°å¢è´¨æ£*/ List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId())); if (productProcessRouteItem.getIsQuality()) { //对åºçè¿ç¨æ£æè åºåæ£ int inspectType = 1; String process = productProcess.getName();//å·¥åº if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) { //æåä¸éå·¥åºçæåºåæ£ inspectType = 2; process = null; } Product product = productMapper.selectById(productModel.getProductId()); QualityInspect qualityInspect = new QualityInspect(); qualityInspect.setProductId(product.getId()); qualityInspect.setProductName(product.getProductName()); qualityInspect.setModel(productModel.getModel()); qualityInspect.setUnit(productModel.getUnit()); qualityInspect.setQuantity(productQty); qualityInspect.setProcess(process); qualityInspect.setInspectState(0); qualityInspect.setInspectType(inspectType); qualityInspect.setProductMainId(productionProductMain.getId()); qualityInspect.setProductModelId(productModel.getId()); qualityInspectMapper.insert(qualityInspect); List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process); if (qualityTestStandard.size() > 0) { qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId()); qualityInspectMapper.updateById(qualityInspect); qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery() .eq(QualityTestStandardParam::getTestStandardId, qualityTestStandard.get(0).getId()))//é»è®¤è·åææ°ç .forEach(qualityTestStandardParam -> { QualityInspectParam param = new QualityInspectParam(); BeanUtils.copyProperties(qualityTestStandardParam, param); param.setId(null); param.setInspectId(qualityInspect.getId()); qualityInspectParamMapper.insert(param); }); } }else { //ç´æ¥å ¥åº stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId()); // éè¦è´¨æ£æ¶ææ°å¢è¿ç¨æ£/åºåæ£ if (needQuality) { createQualityInspect(productionProductMain.getId(), outputProductModelId, productQty, 1, "ç产æ¥å·¥"); } stockUtils.addStock(outputProductModelId, productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId()); /*æ´æ°å·¥ååç产订å*/ ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId()); productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(productQty)); if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) { productWorkOrder.setActualStartTime(LocalDateTime.now());//å®é å¼å§æ¶é´ int woRows = productWorkOrderMapper.addCompleteQtyIfNotExceed(dto.getWorkOrderId(), productQty); if (woRows <= 0) { ProductWorkOrder current = productWorkOrderMapper.selectById(dto.getWorkOrderId()); throw new ServiceException("æ¬æ¬¡ç产æ°éä¸è½å¤§äºå©ä½æ°éï¼å©ä½æ°é: " + (current == null ? "0" : current.getPlanQuantity().subtract(current.getCompleteQuantity()))); } if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0) { productWorkOrder.setActualEndTime(LocalDateTime.now());//å®é ç»ææ¶é´ // æ å·¥èºè·¯çº¿åºæ¯ï¼æ¥å·¥å³è®¡å ¥ç产订å宿æ°é int poRows = productOrderMapper.addCompleteQtyIfNotExceed(productOrder.getId(), productQty); if (poRows <= 0) { ProductOrder currentOrder = productOrderMapper.selectById(productOrder.getId()); throw new ServiceException("æ¬æ¬¡ç产æ°éä¸è½å¤§äºè®¢åå©ä½æ°éï¼å©ä½æ°é: " + (currentOrder == null ? "0" : currentOrder.getQuantity().subtract(currentOrder.getCompleteQuantity()))); } productWorkOrderMapper.updateById(productWorkOrder); //ç产订å ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId()); if (ObjectUtils.isNull(productOrder.getStartTime())) { productOrder.setStartTime(LocalDateTime.now());//å¼å§æ¶é´ ProductOrder latestOrder = productOrderMapper.selectById(productOrder.getId()); if (needQuality && latestOrder != null && latestOrder.getCompleteQuantity() != null && latestOrder.getQuantity() != null && latestOrder.getCompleteQuantity().compareTo(latestOrder.getQuantity()) >= 0) { // 订åå®ææ¶æ°å¢åºåæ£ createQualityInspect(productionProductMain.getId(), outputProductModelId, productQty, 2, null); } if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) { //å¦ææ¯æåä¸éå·¥åºæ¥å·¥ä¹åç产订å宿æ°é+ productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().add(productQty)); if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0) { productOrder.setEndTime(LocalDateTime.now());//ç»ææ¶é´ } } productOrderMapper.updateById(productOrder); /*æ·»å çäº§æ ¸ç® åºåå·¥åºæ¯è®¡ä»¶è¿æ¯è®¡æ¶*/ BigDecimal workHours = (productProcess.getType() == 1) ? productProcess.getSalaryQuota().multiply(productQty) : productProcess.getSalaryQuota(); BigDecimal workHours = durationMinutes.divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_UP); SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder() .productMainId(productionProductMain.getId()) @@ -245,7 +406,7 @@ .schedulingUserName(user.getNickName()) .finishedNum(productQty) .workHours(workHours) .process(productProcess.getName()) .process(resolveProcessTypeName(productWorkOrder)) .schedulingDate(LocalDate.now()) .tenantId(dto.getTenantId()) .build(); @@ -254,27 +415,159 @@ //妿æ¥åºæ°é>0,éè¦è¿å ¥æ¥åºçåºå if (ObjectUtils.isNotEmpty(dto.getScrapQty())) { if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) { stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId()); stockUtils.addUnStock(outputProductModelId, dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId()); } } return true; } /** * å建质æ£åè´¨æ£åæ° */ private void createQualityInspect(Long productMainId, Long productModelId, BigDecimal qty, Integer inspectType, String process) { ProductModel productModel = productModelMapper.selectById(productModelId); if (productModel == null) { return; } Product product = productMapper.selectById(productModel.getProductId()); if (product == null) { return; } QualityInspect qualityInspect = new QualityInspect(); qualityInspect.setProductId(product.getId()); qualityInspect.setProductName(product.getProductName()); qualityInspect.setModel(productModel.getModel()); qualityInspect.setUnit(productModel.getUnit()); qualityInspect.setQuantity(qty); qualityInspect.setProcess(process); qualityInspect.setInspectState(0); qualityInspect.setInspectType(inspectType); qualityInspect.setProductMainId(productMainId); qualityInspect.setProductModelId(productModelId); qualityInspectMapper.insert(qualityInspect); List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process); if (qualityTestStandard.isEmpty()) { return; } qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId()); qualityInspectMapper.updateById(qualityInspect); qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery() .eq(QualityTestStandardParam::getTestStandardId, qualityTestStandard.get(0).getId())) .forEach(qualityTestStandardParam -> { QualityInspectParam param = new QualityInspectParam(); BeanUtils.copyProperties(qualityTestStandardParam, param); param.setId(null); param.setInspectId(qualityInspect.getId()); qualityInspectParamMapper.insert(param); }); } /** * æ¯å¦éè¦è´¨æ£ï¼ä¾æ®å·¥åºè¡¨ is_qualityï¼1-éè¦ï¼0-ä¸éè¦ï¼ */ private boolean isNeedQualityByWorkOrder(ProductWorkOrder workOrder) { if (workOrder == null || workOrder.getProductProcessRouteItemId() == null) { return true; } ProductProcessRouteItem routeItem = productProcessRouteItemMapper.selectById(workOrder.getProductProcessRouteItemId()); if (routeItem == null || routeItem.getProcessId() == null) { return true; } ProductProcess process = productProcessMapper.selectById(routeItem.getProcessId()); if (process == null || process.getIsQuality() == null) { return true; } return process.getIsQuality(); } /** * è·åå·¥åºå¯¹åºçâé¨ä»¶ç±»åâææ¡ */ private String resolveProcessTypeName(ProductWorkOrder workOrder) { if (workOrder == null || workOrder.getProductProcessRouteItemId() == null) { return "å ¶ä»"; } ProductProcessRouteItem routeItem = productProcessRouteItemMapper.selectById(workOrder.getProductProcessRouteItemId()); if (routeItem == null || routeItem.getProcessId() == null) { return "å ¶ä»"; } ProductProcess process = productProcessMapper.selectById(routeItem.getProcessId()); if (process == null || process.getType() == null) { return "å ¶ä»"; } for (ProductProcessEnum value : ProductProcessEnum.values()) { if (value.getCode().equals(process.getType())) { return value.getInfo(); } } return "å ¶ä»"; } private void saveDailyDurations(ProductionProductMain main, LocalDateTime start, LocalDateTime end) { if (main == null || start == null || end == null) { return; } if (end.isBefore(start)) { return; } // 鲿¢éå¤åï¼ä¾å¦è¯¯éå¤ç»ææ¶ï¼ï¼å å åæ productionProductReportDailyMapper.delete( Wrappers.<ProductionProductReportDaily>lambdaQuery() .eq(ProductionProductReportDaily::getProductMainId, main.getId()) ); LocalDateTime cursor = start; while (cursor.isBefore(end)) { LocalDate date = cursor.toLocalDate(); LocalDateTime nextDayStart = date.plusDays(1).atStartOfDay(); LocalDateTime sliceEnd = end.isBefore(nextDayStart) ? end : nextDayStart; long seconds = Duration.between(cursor, sliceEnd).getSeconds(); BigDecimal minutes = secondsToMinutesExact(seconds); if (minutes.compareTo(BigDecimal.ZERO) > 0) { ProductionProductReportDaily daily = new ProductionProductReportDaily(); daily.setProductMainId(main.getId()); daily.setWorkOrderId(main.getWorkOrderId()); daily.setProductProcessRouteItemId(main.getProductProcessRouteItemId()); daily.setUserId(main.getUserId()); daily.setReportDate(date); daily.setStartTime(cursor); daily.setEndTime(sliceEnd); daily.setDurationMinutes(minutes); productionProductReportDailyMapper.insert(daily); } cursor = sliceEnd; } } /** * ç§è½¬åéï¼å å«åç§å¹¶åä¸åæ´å°åé */ private BigDecimal secondsToMinutesExact(long seconds) { if (seconds <= 0L) { return BigDecimal.ZERO; } return BigDecimal.valueOf(seconds).divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_UP); } @Override public Boolean removeProductMain(Long id) { //å¤æè¯¥æ¡æ¥å·¥æ¯å¦ä¸åæ ¼å¤ç,妿ä¸åæ ¼å¤çäºï¼åä¸å 许å é¤ List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, id)); if (qualityInspects.size() > 0){ if (qualityInspects.size() > 0) { List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.selectList(Wrappers.<QualityUnqualified>lambdaQuery() .in(QualityUnqualified::getInspectId, qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList()))); if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState()==1) { if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState() == 1) { throw new ServiceException("è¯¥æ¡æ¥å·¥å·²ç»ä¸åæ ¼å¤çäºï¼ä¸å 许å é¤"); } } ProductionProductMain productionProductMain = productionProductMainMapper.selectById(id); //该æ¥å·¥å¯¹åºçå·¥èºè·¯çº¿è¯¦æ ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(productionProductMain.getProductProcessRouteItemId()); ProductionProductOutput productionProductOutput = productionProductOutputMapper.selectList(Wrappers.<ProductionProductOutput>lambdaQuery().eq(ProductionProductOutput::getProductMainId, productionProductMain.getId())).get(0); List<ProductionProductOutput> outputList = productionProductOutputMapper.selectList( Wrappers.<ProductionProductOutput>lambdaQuery().eq(ProductionProductOutput::getProductMainId, productionProductMain.getId()) ); ProductionProductOutput productionProductOutput = outputList.isEmpty() ? null : outputList.get(0); /*å 餿 ¸ç®*/ salesLedgerProductionAccountingMapper.delete( new LambdaQueryWrapper<SalesLedgerProductionAccounting>() @@ -282,35 +575,31 @@ ); /*æ´æ°å·¥ååç产订å*/ ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId()); BigDecimal validQuantity = BigDecimal.ZERO; if (productWorkOrder != null && productionProductOutput != null) { BigDecimal outputQty = productionProductOutput.getQuantity() == null ? BigDecimal.ZERO : productionProductOutput.getQuantity(); BigDecimal scrapQty = productionProductOutput.getScrapQty() == null ? BigDecimal.ZERO : productionProductOutput.getScrapQty(); BigDecimal completeQty = productWorkOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productWorkOrder.getCompleteQuantity(); BigDecimal validQuantity = outputQty.subtract(scrapQty); validQuantity = outputQty.subtract(scrapQty); productWorkOrder.setCompleteQuantity(completeQty.subtract(validQuantity)); productWorkOrder.setActualEndTime(null); productWorkOrderMapper.updateById(productWorkOrder); } else { } else if (productWorkOrder == null) { throw new ServiceException("æä½å¤±è´¥ï¼å·¥åä¿¡æ¯æäº§åºè®°å½ä¸åå¨"); } //夿æ¯å¦æ¯æåä¸éå·¥åº List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId())); if (productProcessRouteItem.getDragSort() != null && productProcessRouteItems != null && productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) { // æ å·¥èºè·¯çº¿åºæ¯ï¼å 餿¥å·¥æ¶åªè¦æææäº§åºå°±æ£åç产订å宿æ°é if (productionProductOutput != null && validQuantity.compareTo(BigDecimal.ZERO) > 0) { ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId()); if (productOrder != null) { BigDecimal orderCompleteQty = productOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productOrder.getCompleteQuantity(); BigDecimal totalQty = productionProductOutput.getQuantity() != null ? productionProductOutput.getQuantity() : BigDecimal.ZERO; BigDecimal scrapQty = productionProductOutput.getScrapQty() != null ? productionProductOutput.getScrapQty() : BigDecimal.ZERO; BigDecimal actualQualifiedQty = totalQty.subtract(scrapQty); BigDecimal newCompleteQty = orderCompleteQty.subtract(actualQualifiedQty); productOrder.setCompleteQuantity(newCompleteQty.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : newCompleteQty); productOrder.setEndTime(null); productOrderMapper.updateById(productOrder); } else { if (productOrder == null) { throw new ServiceException("å ³èçç产订åä¸åå¨"); } BigDecimal orderCompleteQty = productOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productOrder.getCompleteQuantity(); BigDecimal newCompleteQty = orderCompleteQty.subtract(validQuantity); productOrder.setCompleteQuantity(newCompleteQty.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : newCompleteQty); productOrder.setEndTime(null); productOrderMapper.updateById(productOrder); } //å é¤è´¨æ£ qualityInspectMapper.selectList( @@ -321,7 +610,7 @@ new LambdaQueryWrapper<QualityInspectParam>() .eq(QualityInspectParam::getInspectId, q.getId())); qualityInspectMapper.deleteById(q.getId()); stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()); stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()); }); // å é¤äº§åºè®°å½ src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -110,4 +110,14 @@ WHERE create_time >= #{startDate} AND create_time <= #{endDate} AND complete_quantity < quantity </select> <update id="addCompleteQtyIfNotExceed"> update product_order set complete_quantity = complete_quantity + #{delta}, start_time = ifnull(start_time, now()), end_time = case when (complete_quantity + #{delta}) = quantity then now() else end_time end where id = #{id} and (complete_quantity + #{delta}) <![CDATA[ <= ]]> quantity </update> </mapper> src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -21,7 +21,15 @@ <select id="pageProductWorkOrder" resultType="com.ruoyi.production.dto.ProductWorkOrderDto"> SELECT pwo.*, pp.NAME as processName, CASE pp.type WHEN 1 THEN 'å å·¥' WHEN 2 THEN '宿¿å·è¯å¶ä½' WHEN 3 THEN '管路ç»å¯¹' WHEN 4 THEN 'ç½ä½è¿æ¥åè°è¯' WHEN 5 THEN 'æµè¯æå' WHEN 6 THEN 'å ¶ä»' ELSE pp.NAME END as processName, pm.model, pm.unit, p.product_name AS productName, @@ -62,7 +70,15 @@ <select id="getProductWorkOrderFlowCard" resultType="com.ruoyi.production.dto.ProductWorkOrderDto"> SELECT pwo.*, pp.NAME as processName, CASE pp.type WHEN 1 THEN 'å å·¥' WHEN 2 THEN '宿¿å·è¯å¶ä½' WHEN 3 THEN '管路ç»å¯¹' WHEN 4 THEN 'ç½ä½è¿æ¥åè°è¯' WHEN 5 THEN 'æµè¯æå' WHEN 6 THEN 'å ¶ä»' ELSE pp.NAME END as processName, pm.model, pm.unit, p.product_name AS productName, @@ -105,4 +121,14 @@ limit 1 ; </select> <update id="addCompleteQtyIfNotExceed"> update product_work_order set complete_quantity = complete_quantity + #{delta}, actual_start_time = ifnull(actual_start_time, now()), actual_end_time = case when (complete_quantity + #{delta}) = plan_quantity then now() else actual_end_time end where id = #{id} and (complete_quantity + #{delta}) <![CDATA[ <= ]]> plan_quantity </update> </mapper> src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -10,20 +10,55 @@ <result property="tenantId" column="tenant_id"/> <result property="createTime" column="create_time"/> <result property="status" column="status"/> <result property="reportStartTime" column="report_start_time"/> <result property="reportEndTime" column="report_end_time"/> <result property="reportDurationMinutes" column="report_duration_minutes"/> </resultMap> <select id="listPageProductionProductMainDto" resultType="com.ruoyi.production.dto.ProductionProductMainDto"> select ppm.*, pwo.work_order_no as workOrderNo, pwo.status as workOrderStatus, u.nick_name as nickName, p.product_name as productName, pp.name as process, pm.model as productModelName, ppo.quantity, ppo.scrap_qty, pm.unit, sl.sales_contract_no salesContractNo select min(ppm.id) as id, null as productNo, min(ppm.user_id) as userId, min(ppm.work_order_id) as workOrderId, min(ppm.status) as status, min(ppm.report_start_time) as reportStartTime, max(ppm.report_end_time) as reportEndTime, sum(ifnull(ppm.report_duration_minutes, 0)) as reportDurationMinutes, max(pwo.work_order_no) as workOrderNo, max(po.nps_no) as productOrderNpsNo, max(pwo.status) as workOrderStatus, max(u.nick_name) as nickName, max(p.product_name) as productName, max(CASE pp.type WHEN 1 THEN 'å å·¥' WHEN 2 THEN '宿¿å·è¯å¶ä½' WHEN 3 THEN '管路ç»å¯¹' WHEN 4 THEN 'ç½ä½è¿æ¥åè°è¯' WHEN 5 THEN 'æµè¯æå' WHEN 6 THEN 'å ¶ä»' ELSE pp.name END) as process, max(pm.model) as productModelName, sum(ifnull(ppo.quantity, 0)) as quantity, sum(ifnull(ppo.scrap_qty, 0)) as scrapQty, sum(ifnull(ppo.quantity, 0)) as outputTotalQuantity, sum(ifnull(ppo.scrap_qty, 0)) as scrapTotalQuantity, round(ifnull(( select sum(ifnull(pri.planned_work_hours, 0)) from product_process_route_item pri where pri.product_order_id = po.id ), 0), 2) as projectTotalHours, ifnull(max(pp.salary_quota), 0) as processStandardHours, round(sum(ifnull(ppm.report_duration_minutes, 0)) / 60, 2) as actualReportHours, round(ifnull(( select sum(d.duration_minutes) from production_product_report_daily d where d.user_id = ppm.user_id and d.report_date = curdate() ), 0) / 60, 2) as dailyPersonHours, max(pm.unit) as unit, max(sl.sales_contract_no) as salesContractNo from production_product_main ppm left join product_work_order pwo on pwo.id = ppm.work_order_id @@ -48,10 +83,155 @@ <if test="c.status != null and c.status != ''"> and ppm.status = #{c.status} </if> <if test="c.userId != null"> and ppm.user_id = #{c.userId} </if> </where> order by ppm.id group by ppm.work_order_id, po.sales_ledger_id, po.sale_ledger_product_id, ppm.user_id order by max(ppm.id) desc </select> <select id="listPageProductionProductMainDailyDto" resultType="com.ruoyi.production.dto.ProductionProductMainDto"> select min(ppm.id) as id, min(ppm.product_no) as productNo, d.user_id as userId, d.work_order_id as workOrderId, max(pwo.work_order_no) as workOrderNo, max(po.nps_no) as productOrderNpsNo, max(pwo.status) as workOrderStatus, max(u.nick_name) as nickName, max(p.product_name) as productName, max(CASE pp.type WHEN 1 THEN 'å å·¥' WHEN 2 THEN '宿¿å·è¯å¶ä½' WHEN 3 THEN '管路ç»å¯¹' WHEN 4 THEN 'ç½ä½è¿æ¥åè°è¯' WHEN 5 THEN 'æµè¯æå' WHEN 6 THEN 'å ¶ä»' ELSE pp.name END) as process, max(pm.model) as productModelName, max(pm.unit) as unit, max(sl.sales_contract_no) as salesContractNo, d.report_date as schedulingDate, sum(d.duration_minutes) as reportDurationMinutes, round(sum(d.duration_minutes) / 60, 2) as dailyPersonHours, round(sum(d.duration_minutes) / 60, 2) as actualReportHours, sum(ifnull(ppo.quantity, 0)) as quantity, sum(ifnull(ppo.scrap_qty, 0)) as scrapQty, sum(ifnull(ppo.quantity, 0)) as outputTotalQuantity, sum(ifnull(ppo.scrap_qty, 0)) as scrapTotalQuantity, round(ifnull(( select sum(ifnull(pri.planned_work_hours, 0)) from product_process_route_item pri where pri.product_order_id = po.id ), 0), 2) as projectTotalHours, ifnull(max(pp.salary_quota), 0) as processStandardHours from production_product_report_daily d left join production_product_main ppm on ppm.id = d.product_main_id left join product_work_order pwo on pwo.id = d.work_order_id left join product_process_route_item ppri on ppri.id = pwo.product_process_route_item_id left join product_process pp on pp.id = ppri.process_id left join product_order po on po.id = pwo.product_order_id left join production_product_output ppo on ppm.id = ppo.product_main_id and date(ppm.report_end_time) = d.report_date left join product_model pm on pm.id = ppo.product_model_id left join product p on p.id = pm.product_id left join sales_ledger sl on sl.id = po.sales_ledger_id left join sys_user u on u.user_id = d.user_id <where> <if test="c.workOrderId != null"> and d.work_order_id = #{c.workOrderId} </if> <if test="c.nickName != null and c.nickName != ''"> and u.nick_name like concat('%',#{c.nickName},'%') </if> <if test="c.workOrderNo != null and c.workOrderNo != ''"> and pwo.work_order_no like concat('%',#{c.workOrderNo},'%') </if> <if test="c.workOrderStatus != null and c.workOrderStatus != ''"> and pwo.status = #{c.workOrderStatus} </if> <if test="c.userId != null"> and d.user_id = #{c.userId} </if> <if test="c.startDate != null"> and d.report_date <![CDATA[ >= ]]> #{c.startDate} </if> <if test="c.endDate != null"> and d.report_date <![CDATA[ <= ]]> #{c.endDate} </if> </where> group by d.work_order_id, d.user_id, d.report_date, po.sales_ledger_id, po.sale_ledger_product_id order by d.report_date desc, d.user_id </select> <select id="listPageProductionProductMainDetailDto" resultType="com.ruoyi.production.dto.ProductionProductMainDto"> select ppm.*, pwo.work_order_no as workOrderNo, po.nps_no as productOrderNpsNo, pwo.status as workOrderStatus, u.nick_name as nickName, p.product_name as productName, CASE pp.type WHEN 1 THEN 'å å·¥' WHEN 2 THEN '宿¿å·è¯å¶ä½' WHEN 3 THEN '管路ç»å¯¹' WHEN 4 THEN 'ç½ä½è¿æ¥åè°è¯' WHEN 5 THEN 'æµè¯æå' WHEN 6 THEN 'å ¶ä»' ELSE pp.name END as process, pm.model as productModelName, ppo.quantity, ppo.scrap_qty as scrapQty, ppo.quantity as outputTotalQuantity, ppo.scrap_qty as scrapTotalQuantity, pm.unit, sl.sales_contract_no salesContractNo, round(ifnull(( select sum(ifnull(pri.planned_work_hours, 0)) from product_process_route_item pri where pri.product_order_id = po.id ), 0), 2) as projectTotalHours, ifnull(pp.salary_quota, 0) as processStandardHours, round(ifnull(ppm.report_duration_minutes, 0) / 60, 2) as actualReportHours, round(ifnull(( select sum(d.duration_minutes) from production_product_report_daily d where d.user_id = ppm.user_id and d.report_date = curdate() ), 0) / 60, 2) as dailyPersonHours from production_product_main ppm left join product_work_order pwo on pwo.id = ppm.work_order_id left join product_process_route_item ppri on ppri.id = pwo.product_process_route_item_id left join product_process pp on pp.id = ppri.process_id left join product_order po on po.id = pwo.product_order_id left join production_product_output ppo on ppm.id = ppo.product_main_id left join product_model pm on pm.id = ppo.product_model_id left join product p on p.id = pm.product_id left join sales_ledger sl on sl.id = po.sales_ledger_id left join sys_user u on u.user_id = ppm.user_id <where> <if test="c.workOrderId != null"> and ppm.work_order_id = #{c.workOrderId} </if> <if test="c.userId != null"> and ppm.user_id = #{c.userId} </if> <if test="c.startDate != null"> and date(ppm.report_end_time) <![CDATA[ >= ]]> #{c.startDate} </if> <if test="c.endDate != null"> and date(ppm.report_end_time) <![CDATA[ <= ]]> #{c.endDate} </if> </where> order by ppm.id desc </select> <select id="getOrderByMainId" resultType="com.ruoyi.production.pojo.ProductOrder"> select po.* from product_order po src/main/resources/mapper/production/ProductionProductReportDailyMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,32 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.production.mapper.ProductionProductReportDailyMapper"> <select id="listDailySummary" resultType="com.ruoyi.production.dto.ProductionReportDailySummaryDto"> select report_date as reportDate, sum(duration_minutes) as durationMinutes from production_product_report_daily where 1=1 <if test="workOrderId != null"> and work_order_id = #{workOrderId} </if> <if test="productProcessRouteItemId != null"> and product_process_route_item_id = #{productProcessRouteItemId} </if> <if test="userId != null"> and user_id = #{userId} </if> <if test="startDate != null"> and report_date <![CDATA[ >= ]]> #{startDate} </if> <if test="endDate != null"> and report_date <![CDATA[ <= ]]> #{endDate} </if> group by report_date order by report_date </select> </mapper> src/main/resources/mapper/system/SysUserMapper.xml
@@ -153,6 +153,7 @@ <select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult"> select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1 </select> <select id="selectUserByIds" resultType="com.ruoyi.project.system.domain.SysUser"> <include refid="selectUserVo"/> where u.user_id in <foreach collection="userIds" item="item" open="(" separator="," close=")"> @@ -160,6 +161,7 @@ </foreach> and u.del_flag = '0' </select> <select id="selectRegistrantIds" resultType="com.ruoyi.project.system.domain.SysUser"> SELECT user_id, nick_name FROM sys_user <where>