package com.glxp.api.req.dev; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.glxp.api.entity.auth.AuthAdmin; import com.glxp.api.entity.dev.DeviceChangeOrderEntity; import com.glxp.api.entity.dev.DeviceChangeOrderItemEntity; import com.glxp.api.enums.dev.DeviceChangeStatusEnum; import com.glxp.api.enums.dev.DeviceChangeTypeEnum; import com.glxp.api.exception.JsonException; import com.glxp.api.util.SnowflakeUtil; import lombok.Data; import org.hibernate.validator.constraints.Length; import javax.validation.Valid; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 设备变更单 */ @Data public class DeviceChangeOrderParam { /** * 变更单类型 */ @NotNull(message = "类型不能为空") DeviceChangeTypeEnum type; /** * 目标部门 */ String toDeptCode; /** * 备注 */ @Length(max = 500, message = "备注最多500个字") String remark; @Valid @NotEmpty(message = "明细不能为空") List items; /** * 编码 */ @TableId(value = "orderId") private Long orderId; /** * 1.待目标部门接收 ,2.完成(目标确认接收) ,3.目标部门拒收,4.取消 */ private DeviceChangeStatusEnum status; /** * 创建部门 */ private String deptCode; /** * 确认人id */ private Long confirmUser; /** * 确认人姓名 */ private String confirmUserName; /** * 确认时间 */ private LocalDateTime confirmTime; /** * */ private String confirmRemark; /** * 创建人 */ @TableField(value = "createUserName") private String createUserName; /** * 创建人id */ @TableField(value = "createUser") private Long createUser; /** * 创建时间 */ @TableField(value = "createTime") private LocalDateTime createTime; @Data public static class Item { /** * 设备编码 */ @NotBlank(message = "设备编码不能为空") @Pattern(regexp = "^[A-Za-z0-9]{1,20}$", message = "设备编码只能为(大小写字母、数字)组合或其中一项,最多20个字符") private String deviceCode; /** * 产品id */ // @NotNull(message = "产品id不能为空") private Long productId; /** * UDI码 */ private String udi; /** * 批次号 */ private String batchNo; /** * 序列号 */ private String serialNo; /** * 生产日期 */ private LocalDate productionDate; /** * 失效日期 */ private LocalDate expireDate; private String ggxh; private String manufactory; private String measname; private String nameCode; private String productName; private String zczbhhzbapzbh; /** * 来源类型 */ private String sourceType; /** * 供应商ID */ @TableField(value = "supId") private String supId; /** * 供应商名称 */ @TableField(value = "supName") private String supName; /** * 备注 */ @TableField(value = "remark") private String remark; } public void valid(AuthAdmin user) { if (StrUtil.isBlank(this.deptCode)) { throw new JsonException("请选择操作部门"); } if (this.type == DeviceChangeTypeEnum.CHANGE) { if (StrUtil.isBlank(this.toDeptCode)) { throw new JsonException("请选择目标部门"); } else if (this.toDeptCode.equals(user.getLocDeptCode())) { throw new JsonException("目标部门不能为当前部门"); } } else { this.toDeptCode = user.getLocDeptCode(); items.stream().forEach(i -> { if (i.getProductId() == null) { throw new JsonException("产品id不能为空"); } }); } Map> map = items.stream().collect(Collectors.groupingBy(Item::getDeviceCode)); map.entrySet().stream().forEach(i -> { if (i.getValue().size() > 1) { throw new JsonException(500, String.format("设备编码[%s]重复请检查", i.getKey())); } }); } public DeviceChangeOrderEntity getOrderEntity(AuthAdmin user) { if (orderId != null) { DeviceChangeOrderEntity deviceChangeOrderEntity = new DeviceChangeOrderEntity(); BeanUtil.copyProperties(this, deviceChangeOrderEntity); return deviceChangeOrderEntity; } DeviceChangeOrderEntity order = DeviceChangeOrderEntity.builder() .orderId(SnowflakeUtil.getId()) .type(type) .status(DeviceChangeStatusEnum.WAIT_CONFIRM) .deptCode(deptCode) .toDeptCode(toDeptCode) .remark(remark) .createUser(user.getId()) .createUserName(user.getEmployeeName()) .createTime(LocalDateTime.now()) .build(); // 新增时状态直接为完成 if (type == DeviceChangeTypeEnum.ADD || type == DeviceChangeTypeEnum.DESTROY) { order.setStatus(DeviceChangeStatusEnum.FINISH) .setConfirmTime(order.getCreateTime()) .setConfirmUser(order.getCreateUser()) .setConfirmUserName(order.getCreateUserName()) ; } return order; } public List getOrderItemList(Long orderId, AuthAdmin user) { return items.stream().map(i -> { DeviceChangeOrderItemEntity itemEntity = new DeviceChangeOrderItemEntity(); if (type == DeviceChangeTypeEnum.ADD) { BeanUtil.copyProperties(i, itemEntity); } else { itemEntity.setDeviceCode(i.getDeviceCode()); } itemEntity.setOrderId(orderId); return itemEntity; }).collect(Collectors.toList()); } public List getDraftOrderItemList(Long orderId, AuthAdmin user) { return items.stream().map(i -> { DeviceChangeOrderItemEntity itemEntity = new DeviceChangeOrderItemEntity(); BeanUtil.copyProperties(i, itemEntity); itemEntity.setOrderId(orderId); return itemEntity; }).collect(Collectors.toList()); } }