fix:1.班次页面:月度统计时间调整为上月26到本月25;班次支持右键添加批注
2.外购下单:KJNS域订单免检自动更新批次属性;外购下单-全部页新增【更新IFS批次属性】按钮,支持更新已提交订单的批次属性
3.资源要求-设备:设备核查计划:核查负责人回显问题修复;设备使用授权:检验项目导出数据错误问题修复
已添加1个文件
已修改21个文件
314 ■■■■ 文件已修改
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceImpowerController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceImpowerService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceExaminePlanDetailsMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/device-impower.docx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/aspect/PushIfsPartPropsRecordAspect.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/IfsPartPropsRecordMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/IfsSplitOrderRecordMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/IfsPartPropsRecordService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/IfsSplitOrderRecordService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsPartPropsRecordServiceImpl.java 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsSplitOrderRecordServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/IfsPartPropsRecordMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/PerformanceShiftMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/pojo/PerformanceShift.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/PerformanceShiftService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/PerformanceShiftServiceImpl.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin-ztns/src/main/resources/application-druid.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceImpowerController.java
@@ -101,8 +101,8 @@
     */
    @ApiOperation("导出使用授权")
    @GetMapping("/exportDeviceImpower")
    public Result exportDeviceImpower(@RequestParam("impowerId") Integer impowerId, HttpServletResponse response) {
        return deviceImpowerService.exportDeviceImpowerDto(impowerId, response);
    public void exportDeviceImpower(@RequestParam("impowerId") Integer impowerId, HttpServletResponse response) {
        deviceImpowerService.exportDeviceImpowerDto(impowerId, response);
    }
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceImpowerService.java
@@ -67,5 +67,5 @@
    /**
     * ä½¿ç”¨æŽˆæƒå¯¼å‡º
     */
    Result exportDeviceImpowerDto(Integer impowerId, HttpServletResponse response);
    void exportDeviceImpowerDto(Integer impowerId, HttpServletResponse response);
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerServiceImpl.java
@@ -249,7 +249,7 @@
     * @param impowerId è®¾å¤‡ä½¿ç”¨id
     */
    @Override
    public Result exportDeviceImpowerDto(Integer impowerId, HttpServletResponse response) {
    public void exportDeviceImpowerDto(Integer impowerId, HttpServletResponse response) {
        // æŸ¥è¯¢è®¾å¤‡ä½¿ç”¨æŽˆæƒè®¡åˆ’
        DeviceImpower deviceImpower = baseMapper.selectById(impowerId);
        DeviceImpowerDto deviceImpowerDto = new DeviceImpowerDto();
@@ -295,6 +295,5 @@
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
        return Result.success();
    }
}
cnas-device/src/main/resources/mapper/DeviceExaminePlanDetailsMapper.xml
@@ -6,7 +6,24 @@
    <!--设备核查计划详情列表-->
    <select id="pageDeviceExaminePlanDetail" resultType="com.ruoyi.device.dto.DeviceExaminePlanDetailsDto">
        select * from (
        select d.*,
        select
        d.plan_details_id,
        d.plan_id,
        d.device_id,
        d.device_number,
        d.device_name,
        d.check_time,
        d.check_index,
        d.check_method,
        d.how_results,
        d.check_charger_user_id,
        CASE WHEN d.check_charger_user='' or d.check_charger_user is null THEN u.name
        ELSE d.check_charger_user END AS check_charger_user,
        d.remark,
        d.create_user,
        d.create_time,
        d.update_user,
        d.update_time,
        CASE
        WHEN dc.review_status = 0 THEN 3
        WHEN dc.review_status = 1 THEN 2
@@ -18,6 +35,7 @@
        WHEN dd.record_contrast_id IS NOT NULL THEN 1
        ELSE 0 END record_contrast_status
        from device_examine_plan_details d
        left join user u on u.id = d.check_charger_user_id
        left join device_examine_record dc on d.plan_details_id = dc.plan_details_id
        left join device_examine_record_contrast dd on dd.plan_details_id = dc.plan_details_id
        order by check_time asc
cnas-device/src/main/resources/static/word/device-impower.docx
Binary files differ
inspect-server/src/main/java/com/ruoyi/inspect/aspect/PushIfsPartPropsRecordAspect.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.ruoyi.inspect.aspect;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.ruoyi.basic.dto.IfsInventoryQuantityDto;
import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.enums.ContractType;
import com.ruoyi.common.enums.OrderType;
import com.ruoyi.common.utils.api.IfsApiUtils;
import com.ruoyi.inspect.dto.IfsPartPropsRecordDTO;
import com.ruoyi.inspect.service.IfsPartPropsRecordService;
import com.ruoyi.inspect.service.IfsSplitOrderRecordService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
/**
 * å¤–购下单:KJNS域订单免检后,查询ZTNS域相同订单的批次属性并推送到IFS
 */
@Aspect
@Slf4j
@Component
public class PushIfsPartPropsRecordAspect {
    @Autowired
    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
    @Autowired
    private IfsApiUtils ifsApiUtils;
    @Autowired
    private IfsPartPropsRecordService ifsPartPropsRecordService;
    @Before(value = "execution(* com.ruoyi.inspect.service.impl.RawMaterialOrderServiceImpl.rawOrderRelease(..))")
    @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
    public void doAfterReturning(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        if(Objects.nonNull(args) && args.length>0) {
            Long ifsInventoryId = (Long)args[0];
            log.info("id:{}",ifsInventoryId);
            IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
            //如果订单是KJNS域的外购订单,免检时同步ZTNS域的IFS批次属性
            if(StringUtils.equals(ContractType.KJNS.getValue(),ifsInventoryQuantity.getContract()) && StringUtils.equals(OrderType.WG.getValue(),ifsInventoryQuantity.getOrderType())){
                //查询ZTNS域的相同批次订单消息
                IfsInventoryQuantityDto ifsInventoryQuantityDto = new IfsInventoryQuantityDto();
                BeanUtil.copyProperties(ifsInventoryQuantity,ifsInventoryQuantityDto);
                ifsInventoryQuantityDto.setContract(ContractType.ZTNS.getValue());
                IfsPartPropsRecordDTO oneByContract = ifsPartPropsRecordService.getOneByContract(ifsInventoryQuantityDto);
                if(Objects.nonNull(oneByContract)){
                    //更新IFS批次属性
                    Map<String, Object> inAttrMap = new HashMap<>();
                    String actionType = "New";
                    inAttrMap.put("RECORD_ID", UUID.randomUUID().toString());
                    inAttrMap.put("SYSCODE", "LIMS");
                    inAttrMap.put("SYSMODEL", "库存物料批次属性修改");
                    HashMap<String, Object> batchInfoMap = new HashMap<>();
                    batchInfoMap.put("CONTRACT",ContractType.KJNS.getValue());//域
                    batchInfoMap.put("PART_NO",oneByContract.getPartNo());//零件号
                    batchInfoMap.put("LOT_BATCH_NO",oneByContract.getLotBatchNo());//批次号
                    batchInfoMap.put("ATTR1",oneByContract.getDrumNo());//载具编号
                    batchInfoMap.put("ATTR2",oneByContract.getStartMeterMark().toString());//起始米标
                    batchInfoMap.put("ATTR3",oneByContract.getEndMeterMark().toString());//截止米标
                    batchInfoMap.put("ATTR4", oneByContract.getOuterColor());//外护颜色
                    batchInfoMap.put("ATTR5",oneByContract.getInsulationColor());//绝缘颜色
                    batchInfoMap.put("ATTR8",oneByContract.getLetteringInfo());//印字信息
                    batchInfoMap.put("ATTR23","车间订单");//入库来源
                    batchInfoMap.put("ATTR24","0");//分割预留数量
                    batchInfoMap.put("ACTION_TYPE",actionType);//操作类型
                    inAttrMap.put("BATCH_INFO", Collections.singletonList(batchInfoMap));
                    Result result = ifsApiUtils.importPartLotAttr(ContractType.KJNS.getValue(), JSONUtil.toJsonStr(inAttrMap));
                    if(result.getCode()!=200){
                        throw new RuntimeException("库存物料批次属性更新失败:"+result.getMessage());
                    }
                }
                ifsPartPropsRecordService.save(oneByContract);
            }
        }
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/IfsPartPropsRecordMapper.java
@@ -1,5 +1,7 @@
package com.ruoyi.inspect.mapper;
import com.ruoyi.basic.dto.IfsInventoryQuantityDto;
import com.ruoyi.inspect.dto.IfsPartPropsRecordDTO;
import com.ruoyi.inspect.pojo.IfsPartPropsRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@@ -15,6 +17,9 @@
public interface IfsPartPropsRecordMapper extends BaseMapper<IfsPartPropsRecord> {
    Long selectCountByPartNoAndLotBatchNo(@Param("partNo") String partNo, @Param("lotBatchNo") String lotBatchNo);
    IfsPartPropsRecordDTO selectOneByContract(@Param("dto") IfsInventoryQuantityDto ifsInventoryQuantityDto);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/IfsSplitOrderRecordMapper.java
@@ -1,7 +1,7 @@
package com.ruoyi.inspect.mapper;
import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
import org.apache.ibatis.annotations.Mapper;
/**
inspect-server/src/main/java/com/ruoyi/inspect/service/IfsPartPropsRecordService.java
@@ -1,5 +1,6 @@
package com.ruoyi.inspect.service;
import com.ruoyi.basic.dto.IfsInventoryQuantityDto;
import com.ruoyi.inspect.dto.IfsPartPropsRecordDTO;
import com.ruoyi.inspect.pojo.IfsPartPropsRecord;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -14,4 +15,6 @@
    boolean saveOrUpdateProps(IfsPartPropsRecordDTO ifsPartPropsRecord);
    IfsPartPropsRecord getOneByIfsId(Long ifsId);
    IfsPartPropsRecordDTO getOneByContract(IfsInventoryQuantityDto ifsInventoryQuantityDto);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/IfsSplitOrderRecordService.java
@@ -1,7 +1,7 @@
package com.ruoyi.inspect.service;
import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
/**
* @author 27233
@@ -9,5 +9,4 @@
* @createDate 2025-09-23 11:20:20
*/
public interface IfsSplitOrderRecordService extends IService<IfsSplitOrderRecord> {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsPartPropsRecordServiceImpl.java
@@ -3,6 +3,7 @@
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.IfsInventoryQuantityDto;
import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.common.core.domain.Result;
@@ -48,36 +49,33 @@
        if(Objects.isNull(ifsPartPropsRecord)){
            throw new RuntimeException("参数不能为空");
        }
        //查询是否已有同批次同零件号的批次属性,没有才更新
        Long count = baseMapper.selectCountByPartNoAndLotBatchNo(ifsPartPropsRecord.getPartNo(),ifsPartPropsRecord.getLotBatchNo());
        if(count==0){
            //判断是新增还是更新
            String actionType = Objects.isNull(ifsPartPropsRecord.getId())?"New":"Modify";
            Map<String, Object> inAttrMap = new HashMap<>();
            inAttrMap.put("RECORD_ID", UUID.randomUUID().toString());
            inAttrMap.put("SYSCODE", "LIMS");
            inAttrMap.put("SYSMODEL", "库存物料批次属性修改");
            HashMap<String, Object> batchInfoMap = new HashMap<>();
            batchInfoMap.put("CONTRACT",ifsPartPropsRecord.getContract());//域
            batchInfoMap.put("PART_NO",ifsPartPropsRecord.getPartNo());//零件号
            batchInfoMap.put("LOT_BATCH_NO",ifsPartPropsRecord.getLotBatchNo());//批次号
            batchInfoMap.put("ATTR1",ifsPartPropsRecord.getDrumNo());//载具编号
            batchInfoMap.put("ATTR2",ifsPartPropsRecord.getStartMeterMark().toString());//起始米标
            batchInfoMap.put("ATTR3",ifsPartPropsRecord.getEndMeterMark().toString());//截止米标
            batchInfoMap.put("ATTR4", ifsPartPropsRecord.getOuterColor());//外护颜色
            batchInfoMap.put("ATTR5",ifsPartPropsRecord.getInsulationColor());//绝缘颜色
            batchInfoMap.put("ATTR8",ifsPartPropsRecord.getLetteringInfo());//印字信息
            batchInfoMap.put("ATTR23","车间订单");//入库来源
            batchInfoMap.put("ATTR24","0");//分割预留数量
            batchInfoMap.put("ACTION_TYPE",actionType);//操作类型
            inAttrMap.put("BATCH_INFO", Collections.singletonList(batchInfoMap));
            Result result = ifsApiUtils.importPartLotAttr(ifsPartPropsRecord.getContract(),JSONUtil.toJsonStr(inAttrMap));
            if(result.getCode()!=200){
                throw new RuntimeException("库存物料批次属性更新失败:"+result.getMessage());
            }
        //判断是新增还是更新
        String actionType = Objects.isNull(ifsPartPropsRecord.getId())?"New":"Modify";
        Map<String, Object> inAttrMap = new HashMap<>();
        inAttrMap.put("RECORD_ID", UUID.randomUUID().toString());
        inAttrMap.put("SYSCODE", "LIMS");
        inAttrMap.put("SYSMODEL", "库存物料批次属性修改");
        HashMap<String, Object> batchInfoMap = new HashMap<>();
        batchInfoMap.put("CONTRACT",ifsPartPropsRecord.getContract());//域
        batchInfoMap.put("PART_NO",ifsPartPropsRecord.getPartNo());//零件号
        batchInfoMap.put("LOT_BATCH_NO",ifsPartPropsRecord.getLotBatchNo());//批次号
        batchInfoMap.put("ATTR1",ifsPartPropsRecord.getDrumNo());//载具编号
        batchInfoMap.put("ATTR2",ifsPartPropsRecord.getStartMeterMark().toString());//起始米标
        batchInfoMap.put("ATTR3",ifsPartPropsRecord.getEndMeterMark().toString());//截止米标
        batchInfoMap.put("ATTR4", ifsPartPropsRecord.getOuterColor());//外护颜色
        batchInfoMap.put("ATTR5",ifsPartPropsRecord.getInsulationColor());//绝缘颜色
        batchInfoMap.put("ATTR8",ifsPartPropsRecord.getLetteringInfo());//印字信息
        batchInfoMap.put("ATTR23","车间订单");//入库来源
        batchInfoMap.put("ATTR24","0");//分割预留数量
        batchInfoMap.put("ACTION_TYPE",actionType);//操作类型
        inAttrMap.put("BATCH_INFO", Collections.singletonList(batchInfoMap));
        Result result = ifsApiUtils.importPartLotAttr(ifsPartPropsRecord.getContract(),JSONUtil.toJsonStr(inAttrMap));
        if(result.getCode()!=200){
            throw new RuntimeException("库存物料批次属性更新失败:"+result.getMessage());
        }
        return this.saveOrUpdate(ifsPartPropsRecord);
    }
    @Override
    public IfsPartPropsRecord getOneByIfsId(Long ifsId) {
@@ -112,6 +110,11 @@
        }
        return this.getOne(Wrappers.<IfsPartPropsRecord>lambdaQuery().eq(IfsPartPropsRecord::getIfsInventoryId,ifsId).last("limit 1"));
    }
    @Override
    public IfsPartPropsRecordDTO getOneByContract(IfsInventoryQuantityDto ifsInventoryQuantityDto) {
        return baseMapper.selectOneByContract(ifsInventoryQuantityDto);
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsSplitOrderRecordServiceImpl.java
@@ -1,9 +1,9 @@
package com.ruoyi.inspect.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.inspect.mapper.IfsSplitOrderRecordMapper;
import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
import com.ruoyi.inspect.service.IfsSplitOrderRecordService;
import com.ruoyi.inspect.mapper.IfsSplitOrderRecordMapper;
import org.springframework.stereotype.Service;
/**
@@ -14,7 +14,6 @@
@Service
public class IfsSplitOrderRecordServiceImpl extends ServiceImpl<IfsSplitOrderRecordMapper, IfsSplitOrderRecord>
    implements IfsSplitOrderRecordService{
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
@@ -875,8 +875,6 @@
            });
        }
    }
    /**
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java
@@ -7,6 +7,7 @@
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
@@ -27,6 +28,7 @@
import com.ruoyi.common.constant.InsOrderTypeConstants;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.enums.ContractType;
import com.ruoyi.common.enums.OrderType;
import com.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.common.utils.LimsDateUtil;
@@ -35,10 +37,7 @@
import com.ruoyi.common.utils.WxCpUtils;
import com.ruoyi.common.utils.api.IfsApiUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.CopperInsOrderDto;
import com.ruoyi.inspect.dto.OrderSplitDTO;
import com.ruoyi.inspect.dto.RawMaterialStandardTreeDto;
import com.ruoyi.inspect.dto.SampleProductDto;
import com.ruoyi.inspect.dto.*;
import com.ruoyi.inspect.excel.OrderSplitExcelData;
import com.ruoyi.inspect.excel.OrderSplitExcelListener;
import com.ruoyi.inspect.mapper.InsOrderMapper;
@@ -101,8 +100,6 @@
    private IfsApiUtils ifsApiUtils;
    private IfsSplitOrderRecordService ifsSplitOrderRecordService;
    private InsUnqualifiedHandlerMapper insUnqualifiedHandlerMapper;
    private final NumberGenerator<IfsSplitOrderRecord> splitOrderRecordNumberGenerator;
inspect-server/src/main/resources/mapper/IfsPartPropsRecordMapper.xml
@@ -31,4 +31,25 @@
          and iiq.update_batch_no= #{lotBatchNo}
          and ippr.id  is not null
    </select>
    <select id="selectOneByContract" resultType="com.ruoyi.inspect.dto.IfsPartPropsRecordDTO">
        select iiq.part_no,
               iiq.update_batch_no as lot_batch_no,
               iiq.contract,
               ippr.id,
               ippr.ifs_inventory_id,
               ippr.drum_no,
               ippr.start_meter_mark,
               ippr.end_meter_mark,
               ippr.insulation_color,
               ippr.outer_color,
               ippr.lettering_info,
               ippr.part_props_flag
        from ifs_inventory_quantity iiq
                 left join ifs_part_props_record ippr on iiq.id = ippr.ifs_inventory_id
        where iiq.contract = #{dto.contract}
          AND iiq.update_batch_no = #{dto.updateBatchNo}
          AND iiq.part_no = #{dto.partNo}
          AND iiq.order_type = #{dto.orderType}
        LIMIT 1
    </select>
</mapper>
performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java
@@ -55,6 +55,12 @@
    @Resource
    private UserService userService;
    @ApiOperation(value = "编辑批注内容")
    @PostMapping("editAnnotationText")
    public Result<?> editAnnotationText(@RequestBody PerformanceShift performanceShift){
        return Result.success(performanceShiftService.editAnnotationText(performanceShift));
    }
    @ApiOperation(value = "排班")
    @PostMapping("add")
    public Result<?> performanceShiftAdd(@RequestBody PerformanceShiftAddDto performanceShiftAddDto) {
performance-server/src/main/java/com/ruoyi/performance/mapper/PerformanceShiftMapper.java
@@ -7,6 +7,7 @@
import com.ruoyi.performance.pojo.PerformanceShift;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
@@ -22,7 +23,8 @@
    IPage<PerformanceShiftMapDto> performanceShiftPage(
            Page<Object> page,
            @Param("time") String time,
            @Param("firstDayOfMonth") LocalDate firstDayOfMonth,
            @Param("lastDayOfMonth") LocalDate lastDayOfMonth,
            @Param("userName") String userName,
            @Param("laboratory") String laboratory
    );
performance-server/src/main/java/com/ruoyi/performance/pojo/PerformanceShift.java
@@ -51,4 +51,8 @@
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("批注内容")
    private String annotationText;
}
performance-server/src/main/java/com/ruoyi/performance/service/PerformanceShiftService.java
@@ -29,4 +29,6 @@
    Map<Object, Object> exportToYearExcel(String time, String userName, String laboratory) throws Exception;
    Map<Object, Object> exportToMonthExcel(String time, String userName, String laboratory);
    boolean editAnnotationText(PerformanceShift performanceShift);
}
performance-server/src/main/java/com/ruoyi/performance/service/impl/PerformanceShiftServiceImpl.java
@@ -147,7 +147,16 @@
                laboratory = departLims;
            }
        }
        IPage<PerformanceShiftMapDto> mapIPage = baseMapper.performanceShiftPage(page, time, userName, laboratory);
        // èŽ·å–header时间
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // å°†å­—符串时间转换为 LocalDateTime ç±»åž‹æ—¶é—´
        LocalDateTime localDateTime = LocalDateTime.parse(time, formatters);
        //班次时间范围为上个月的26号到本月的25号
        LocalDate firstDayOfMonth = localDateTime.toLocalDate().minusMonths(1L).withDayOfMonth(26);
        LocalDate lastDayOfMonth = localDateTime.toLocalDate().withDayOfMonth(25);
        IPage<PerformanceShiftMapDto> mapIPage = baseMapper.performanceShiftPage(page, firstDayOfMonth,lastDayOfMonth, userName, laboratory);
        List<SysDictData> shiftType = dictTypeService.selectDictDataByName("班次类型");
        List<Map<String, Object>> mapYearIPage = baseMapper.performanceShiftYearPage(time, userName, laboratory);
@@ -168,22 +177,23 @@
                        i.getMonthlyAttendance().put(enums.getDictLabel(), bigDecimal.add(new BigDecimal("1")));
                    }
                    // åŠï¼Œå¦å¤–半天算给早
                    if (shiftTimeAndShift[1].equals("5") && enums.getDictValue().equals("0")) {
                        BigDecimal bigDecimal = new BigDecimal(i.getMonthlyAttendance().get(enums.getDictLabel()).toString());
                        i.getMonthlyAttendance().put(enums.getDictLabel(), bigDecimal.add(new BigDecimal("0.5")));
                    }
//                    if (shiftTimeAndShift[1].equals("5") && enums.getDictValue().equals("0")) {
//                        BigDecimal bigDecimal = new BigDecimal(i.getMonthlyAttendance().get(enums.getDictLabel()).toString());
//                        i.getMonthlyAttendance().put(enums.getDictLabel(), bigDecimal.add(new BigDecimal("0.5")));
//                    }
                }
                // æ—©ï¼Œä¸­ï¼Œå¤œï¼Œå·®
                if (shiftTimeAndShift[1].equals("1") || shiftTimeAndShift[1].equals("2") || shiftTimeAndShift[1].equals("0") || shiftTimeAndShift[1].equals("6")) {
                if (shiftTimeAndShift[1].equals("2") || shiftTimeAndShift[1].equals("3") || shiftTimeAndShift[1].equals("4")) {
                    i.getMonthlyAttendance().put("totalAttendance", totalAttendance += 1);
                }
                // åŠ
                if (shiftTimeAndShift[1].equals("5")) {
                    i.getMonthlyAttendance().put("totalAttendance", totalAttendance += 0.5);
                }
                hashMap.put("id", shiftTimeAndShift[2]);
//                if (shiftTimeAndShift[1].equals("5")) {
//                    i.getMonthlyAttendance().put("totalAttendance", totalAttendance += 0.5);
//                }
                hashMap.put("id", shiftTimeAndShift[3]);
                hashMap.put("shift", shiftTimeAndShift[1]);
                hashMap.put("time", shiftTimeAndShift[0]);
                hashMap.put("annotationText", shiftTimeAndShift[2]);
                map.add(hashMap);
            }
            double totalYearAttendance = 0;
@@ -199,31 +209,24 @@
                            hashMap.put(enums.getDictLabel(), num.add(new BigDecimal("1")));
                        }
                        // åŠï¼Œå¦å¤–半天算给早
                        if (record.get("shift").equals("5") && enums.getDictValue().equals("0")) {
                            BigDecimal bigDecimal = new BigDecimal(hashMap.get(enums.getDictLabel()).toString());
                            hashMap.put(enums.getDictLabel(), bigDecimal.add(new BigDecimal("0.5")));
                        }
//                        if (record.get("shift").equals("5") && enums.getDictValue().equals("0")) {
//                            BigDecimal bigDecimal = new BigDecimal(hashMap.get(enums.getDictLabel()).toString());
//                            hashMap.put(enums.getDictLabel(), bigDecimal.add(new BigDecimal("0.5")));
//                        }
                    }
                    if (record.get("shift").equals("1") || record.get("shift").equals("2") || record.get("shift").equals("0") || record.get("shift").equals("6")) {
                    if (record.get("shift").equals("2") || record.get("shift").equals("3") || record.get("shift").equals("4")) {
                        hashMap.put("totalAttendance", totalYearAttendance += 1);
                    }
                    // åŠ
                    if (record.get("shift").equals("5")) {
                        hashMap.put("totalAttendance", totalYearAttendance += 0.5);
                    }
//                    if (record.get("shift").equals("5")) {
//                        hashMap.put("totalAttendance", totalYearAttendance += 0.5);
//                    }
                }
            }
            i.setSidebarAnnualAttendance(hashMap);
            i.setList(map);
            i.setShiftTime(null);
        });
        // èŽ·å–header时间
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // å°†å­—符串时间转换为 LocalDateTime ç±»åž‹æ—¶é—´
        LocalDateTime localDateTime = LocalDateTime.parse(time, formatters);
        LocalDate firstDayOfMonth = localDateTime.toLocalDate().withDayOfMonth(1);
        LocalDate lastDayOfMonth = localDateTime.toLocalDate().with(TemporalAdjusters.lastDayOfMonth());
        List<LocalDateTime> localDateTimesBetween = getLocalDateTimesBetween(firstDayOfMonth.atStartOfDay(), lastDayOfMonth.atStartOfDay());
        List<Object> list1 = new ArrayList<>();
        for (LocalDateTime dateTime : localDateTimesBetween) {
@@ -409,9 +412,10 @@
                if (shiftTimeAndShift[1].equals("5")) {
                    i.getMonthlyAttendance().put("totalAttendance", totalAttendance += 0.5);
                }
                hashMap.put("id", shiftTimeAndShift[2]);
                hashMap.put("id", shiftTimeAndShift[3]);
                hashMap.put("shift", shiftTimeAndShift[1]);
                hashMap.put("time", shiftTimeAndShift[0]);
                hashMap.put("annotationText", shiftTimeAndShift[2]);
                map.add(hashMap);
            }
            i.setList(map);
@@ -427,6 +431,11 @@
        return map;
    }
    @Override
    public boolean editAnnotationText(PerformanceShift performanceShift) {
        return this.updateById(performanceShift);
    }
    // èŽ·å–ä¸¤ä¸ªlocalDateTime的每一天
    public static List<LocalDateTime> getLocalDateTimesBetween(LocalDateTime start, LocalDateTime end) {
        List<LocalDateTime> localDateTimes = new ArrayList<>();
performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml
@@ -12,7 +12,8 @@
    <select id="performanceShiftPage" resultMap="performanceShiftPageMap">
        SELECT
        u2.name name,
        GROUP_CONCAT(s.work_time, ':', s.shift, ':', s.id order by s.work_time SEPARATOR ';') AS shift_time, u2.id user_id
        GROUP_CONCAT(s.work_time, ':', s.shift, ':',IFNULL(s.annotation_text,''), ':',s.id order by s.work_time SEPARATOR ';') AS shift_time,
        u2.id user_id
        FROM performance_shift s
        LEFT JOIN (SELECT distinct u.* from
        user u
@@ -25,8 +26,8 @@
         ) u2    on u2.id = s.user_id
        <where>
            name is not null
            <if test="time != null and time != ''">
                and DATE_FORMAT(s.work_time, '%Y-%m') = DATE_FORMAT(#{time}, '%Y-%m' )
            <if test="firstDayOfMonth != null and lastDayOfMonth != null">
                AND s.work_time BETWEEN #{firstDayOfMonth} AND #{lastDayOfMonth}
            </if>
            <if test="userName != null and userName != ''">
                and u2.name like concat('%', #{userName}, '%')
ruoyi-admin-ztns/src/main/resources/application-druid.yml
@@ -167,9 +167,9 @@
    - contract: KJNS #科技耐丝域
      contract-key-get: ueWGmvzoc4iR0y%2FsP6iOMeYn3ohC45KTCl3dZ94WaNk%3D #get请求密钥
      contract-key-post: ueWGmvzoc4iR0y/sP6iOMeYn3ohC45KTCl3dZ94WaNk=    #post请求密钥
      custorder: http://192.168.20.50/PurchService.ashx?                 #get请求地址
      custorder-port: http://192.168.20.50:8008/PurchService.ashx?       #post请求地址
      erp-services: http://192.168.20.50:8081                            #erp请求地址
      custorder: http://192.168.47.50/PurchService.ashx?                 #get请求地址
      custorder-port: http://192.168.20.47:8008/PurchService.ashx?       #post请求地址
      erp-services: http://192.168.20.47:8081                            #erp请求地址
      tobe-inspected-location: A101                                      #待检库位
      raw-qualified-location: A201                                       #原材料合格库位
      product-qualified-location: C101                                   #成品合格库位