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.fasterxml.jackson.annotation.JsonFormat; import com.glxp.api.constant.Constant; 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.GennerOrderUtils; import com.glxp.api.util.OrderNoTypeBean; 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.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 设备变更单 */ @Data public class DeviceChangeOrderParam { /** * 变更单类型 */ @NotNull(message = "类型不能为空") DeviceChangeTypeEnum type; /** * 单据号 */ @TableField(value = "billNo") private String billNo; /** * 目标部门 */ 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; /** * 移除类型 */ private Integer destroyType; @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 String productionDate; /** * 失效日期 */ private String 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; /** * 资产分类 */ @TableField(value = "assetType") private String assetType; /** * 国资分类 */ @TableField(value = "sasacType") private String sasacType; /** * 资产助记码 */ @TableField(value = "assetMnemonicCode") private String assetMnemonicCode; /** * 数量 */ @TableField(value = "number") private Integer number; /** * 取得方式 */ @TableField(value = "acquisitionMethod") private String acquisitionMethod; /** * 用途 */ @TableField(value = "purpose") private String purpose; /** * 折旧年 */ @TableField(value = "depreciationYear") private Integer depreciationYear; /** * 折旧月 */ @TableField(value = "depreciationMonth") private Integer depreciationMonth; /** * 存储仓库 */ @TableField(value = "invCode") private String invCode; /** * 预计总工时 */ @TableField(value = "estimatedTotalHour") private Integer estimatedTotalHour; /** * 单日工时 */ @TableField(value = "dayHour") private Integer dayHour; /** * 单个资产价值 */ @TableField(value = "assetValue") private BigDecimal assetValue; /** * 自有资金 */ @TableField(value = "ownFund") private BigDecimal ownFund; /** * 财政拨款 */ @TableField(value = "financialAppropriation") private BigDecimal financialAppropriation; /** * 科教基金 */ @TableField(value = "educationFund") private BigDecimal educationFund; /** * 其他资金 */ @TableField(value = "otherFund") private BigDecimal otherFund; /** * 非同级财政拨款 */ @TableField(value = "nonPeerFinancialAppropriation") private BigDecimal nonPeerFinancialAppropriation; /** * 医疗器械分类编码 */ @TableField(value = "ybbm") private String ybbm; /** * 一级分类名称(学科,品名) */ @TableField(value = "catalogname1") private String catalogname1; /** * 二级分类名称(用途、品目) */ @TableField(value = "catalogname2") private String catalogname2; /** * 三级分类名称(部位、功能、品种) */ @TableField(value = "catalogname3") private String catalogname3; /** * 编码 */ @TableField(value = "catalogCode") private String catalogCode; /** * 编码 */ @TableField(value = "catalogCode1") private Integer catalogCode1; /** * 编码 */ @TableField(value = "catalogCode2") private Integer catalogCode2; /** * 编码 */ @TableField(value = "catalogCode3") private Integer catalogCode3; /** * 管理类别 */ @TableField(value = "managementCategory") private String managementCategory; /** * 使用人 */ @TableField(value = "endUser") private String endUser; /** * 预计残值 */ @TableField(value = "estimatedResidualValue") private BigDecimal estimatedResidualValue; /** * 币种 */ @TableField(value = "currencyType") private String currencyType; /** * 采购类型 */ @TableField(value = "purType") private String purType; /** * 购置日期 */ @TableField(value = "purchaseDate") @JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8") private Date purchaseDate; /** * 添加日期 */ @TableField(value = "addDate") @JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8") private Date addDate; /** * 资产品名 */ @TableField(value = "assetName") private String assetName; /** * 是否强检 */ @TableField(value = "isImperative") private Boolean isImperative; /** * 是否保养 */ @TableField(value = "isMaintain") private Boolean isMaintain; /** * 检定周期(月) */ @TableField(value = "imperativeCycle") private Integer imperativeCycle; /** * 保养周期(月) */ @TableField(value = "maintainCycle") private Integer maintainCycle; /** * 开始检定日期 */ @TableField(value = "startImperativeDate") @JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8") private Date startImperativeDate; /** * 开始保养日期 */ @TableField(value = "startMaintainDate") @JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8") private Date startMaintainDate; /** * 维修组 */ @TableField(value = "serviceType") private String serviceType; /** * 保养组 */ @TableField(value = "maintainType") private String maintainType; /** * 管理人 */ @TableField(value = "managerUser") private String managerUser; /** * 审核人 */ @TableField(value = "approveUser") private String approveUser; /** * 对应会计科目 */ @TableField(value = "ledgerAccount") private String ledgerAccount; /** * 减值准备 */ @TableField(value = "impairmentProvision") private String impairmentProvision; /** * 预计工作量 */ @TableField(value = "estimatedWorkload") private String estimatedWorkload; /** * 已完成工作量 */ @TableField(value = "completedWorkload") private String completedWorkload; /** * 维保类型 */ @TableField(value = "maintenanceType") private String maintenanceType; /** * 维保周期 */ @TableField(value = "maintenanceCycle") private Integer maintenanceCycle; /** * 维保开始日期 */ @TableField(value = "startMaintenancDate") @JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8") private Date startMaintenancDate; /** * 维保结束日期 */ @TableField(value = "endMaintenancDate") @JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8") private Date endMaintenancDate; /** * 内外网 */ @TableField(value = "networkType") private Integer networkType; /** * 使用角色 */ @TableField(value = "userRole") private Integer userRole; /** * 是否加域 */ @TableField(value = "isAddDomain") private Boolean isAddDomain; /** * u盘是否禁用 */ @TableField(value = "isUDisc") private Boolean isUDisc; /** * 设备归类 */ @TableField(value = "ascriptionType") private Integer ascriptionType; /** * 资产备用类型 */ @TableField(value = "assetReserveType") private String assetReserveType; /** * 申购订单id外键 */ @TableField(value = "purApplyBillNo") private String purApplyBillNo; /** * 采购订单id外键 */ @TableField(value = "purOrderBillNo") private String purOrderBillNo; /** * 采购合同id外键 */ @TableField(value = "purContractBillNo") private String purContractBillNo; /** * 采购计划id外键 */ @TableField(value = "purPlanBillNo") private String purPlanBillNo; } 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 (billNo != 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) .destroyType(destroyType) .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()); } }