From f747fddabf9195706eef73c4ca233c881b7dfe75 Mon Sep 17 00:00:00 2001 From: zss <zss@example.com> Date: 星期二, 15 十月 2024 15:38:45 +0800 Subject: [PATCH] 工时调整+标签打印调整+特殊项的保存 --- inspect-server/src/main/java/com/yuanchu/mom/dto/SampleProductDto3.java | 3 inspect-server/src/main/java/com/yuanchu/mom/dto/SubmitPlanDto.java | 24 +++ inspect-server/src/main/resources/mapper/InsSampleMapper.xml | 11 + inspect-server/src/main/java/com/yuanchu/mom/dto/SampleProductDto2.java | 2 performance-server/src/main/java/com/yuanchu/mom/pojo/AuxiliaryOutputWorkingHours.java | 17 + inspect-server/src/main/java/com/yuanchu/mom/dto/InsProductResultDto.java | 1 inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderPlanServiceImpl.java | 276 +++++++++++++++------------------------ inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderServiceImpl.java | 6 performance-server/src/main/java/com/yuanchu/mom/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java | 9 inspect-server/src/main/java/com/yuanchu/mom/controller/InsOrderPlanController.java | 27 ++- performance-server/src/main/resources/mapper/AuxiliaryOutputWorkingHoursMapper.xml | 13 - inspect-server/src/main/java/com/yuanchu/mom/service/InsOrderPlanService.java | 6 12 files changed, 188 insertions(+), 207 deletions(-) diff --git a/inspect-server/src/main/java/com/yuanchu/mom/controller/InsOrderPlanController.java b/inspect-server/src/main/java/com/yuanchu/mom/controller/InsOrderPlanController.java index 0772bc0..0036898 100644 --- a/inspect-server/src/main/java/com/yuanchu/mom/controller/InsOrderPlanController.java +++ b/inspect-server/src/main/java/com/yuanchu/mom/controller/InsOrderPlanController.java @@ -8,8 +8,10 @@ import com.yuanchu.mom.dto.InsOrderPlanDTO; import com.yuanchu.mom.dto.InsProductDto; import com.yuanchu.mom.dto.InsProductResultDto; +import com.yuanchu.mom.dto.SubmitPlanDto; import com.yuanchu.mom.pojo.InsOrderFile; import com.yuanchu.mom.pojo.InsOrderState; +import com.yuanchu.mom.pojo.InsProductResult; import com.yuanchu.mom.service.*; import com.yuanchu.mom.utils.JackSonUtil; import com.yuanchu.mom.vo.InsProductResultVo; @@ -115,8 +117,8 @@ @ValueClassify("妫�楠屼换鍔�") @ApiOperation(value = "妫�楠屼换鍔℃彁浜�") @PostMapping("/submitPlan") - public Result<?> submitPlan(Integer orderId,String laboratory, Integer verifyUser, String entrustCode, String note,String term) { - int num = insOrderPlanService.submitPlan(orderId, laboratory, verifyUser, entrustCode,note,term); + public Result<?> submitPlan(@RequestBody SubmitPlanDto submitPlanDto) { + int num = insOrderPlanService.submitPlan(submitPlanDto); return num == 1 ? Result.success() : Result.fail("鎻愪氦澶辫触锛岄儴鍒嗛」鐩繕鏈繘琛屾楠�"); } @@ -134,6 +136,20 @@ Map<String, Object> param2 = JSON.parseObject(param, Map.class); insOrderPlanService.saveInsContext(param2,num); return Result.success(); + } + + @ApiOperation(value = "鐢佃矾璇曢獙鐨勪繚瀛樻楠屽唴瀹�") + @PostMapping("/saveInsContext2") + @ValueAuth + public Result<?> saveInsContext2(@RequestBody InsProductResultDto insProductResultDtos) { + return Result.success(insOrderPlanService.saveInsContext2(insProductResultDtos)); + } + + @ApiOperation(value = "娓╂箍搴﹁瘯楠�+鍔熺巼璇曢獙鐨勪繚瀛樻楠屽唴瀹�") + @PostMapping("/saveInsContext3") + @ValueAuth + public Result<?> saveInsContext3(@RequestBody InsProductResult insProductResult) { + return Result.success(insOrderPlanService.saveInsContext3(insProductResult)); } @ValueAuth @@ -184,13 +200,6 @@ @PostMapping("/jumpTeam") public Result<?> jumpTeam(@RequestBody InsOrderState insOrderState) { return Result.success(insOrderStateService.jumpTeam(insOrderState)); - } - - @ApiOperation(value = "鐢佃矾璇曢獙鐨勪繚瀛樻楠屽唴瀹�") - @PostMapping("/saveInsContext2") - @ValueAuth - public Result<?> saveInsContext2(@RequestBody InsProductResultDto insProductResultDtos) { - return Result.success(insOrderPlanService.saveInsContext2(insProductResultDtos)); } @ApiOperation(value = "鐢佃矾璇曢獙鐨勫垹闄ら娈�") diff --git a/inspect-server/src/main/java/com/yuanchu/mom/dto/InsProductResultDto.java b/inspect-server/src/main/java/com/yuanchu/mom/dto/InsProductResultDto.java index a531e4a..95a341a 100644 --- a/inspect-server/src/main/java/com/yuanchu/mom/dto/InsProductResultDto.java +++ b/inspect-server/src/main/java/com/yuanchu/mom/dto/InsProductResultDto.java @@ -1,5 +1,6 @@ package com.yuanchu.mom.dto; +import com.yuanchu.mom.pojo.InsProductResult; import com.yuanchu.mom.pojo.InsProductResult2; import lombok.Data; diff --git a/inspect-server/src/main/java/com/yuanchu/mom/dto/SampleProductDto2.java b/inspect-server/src/main/java/com/yuanchu/mom/dto/SampleProductDto2.java index d253543..963c790 100644 --- a/inspect-server/src/main/java/com/yuanchu/mom/dto/SampleProductDto2.java +++ b/inspect-server/src/main/java/com/yuanchu/mom/dto/SampleProductDto2.java @@ -44,7 +44,7 @@ @ValueTableShow(value = 12, name = "璇曢獙瑕佹眰") private String tell; - @ValueTableShow(value = 13, name = "妫�楠岀粨鏋�") +// @ValueTableShow(value = 13, name = "妫�楠岀粨鏋�") private String lastValue; @ValueTableShow(value = 14, name = "缁撴灉鍒ゅ畾") diff --git a/inspect-server/src/main/java/com/yuanchu/mom/dto/SampleProductDto3.java b/inspect-server/src/main/java/com/yuanchu/mom/dto/SampleProductDto3.java index 26c702c..2ab55b7 100644 --- a/inspect-server/src/main/java/com/yuanchu/mom/dto/SampleProductDto3.java +++ b/inspect-server/src/main/java/com/yuanchu/mom/dto/SampleProductDto3.java @@ -4,6 +4,7 @@ import com.yuanchu.mom.pojo.InsSample; import lombok.Data; +import java.time.LocalDate; import java.util.List; @Data @@ -21,4 +22,6 @@ private Integer isLeave; + private LocalDate issueTime; + } diff --git a/inspect-server/src/main/java/com/yuanchu/mom/dto/SubmitPlanDto.java b/inspect-server/src/main/java/com/yuanchu/mom/dto/SubmitPlanDto.java new file mode 100644 index 0000000..52e591c --- /dev/null +++ b/inspect-server/src/main/java/com/yuanchu/mom/dto/SubmitPlanDto.java @@ -0,0 +1,24 @@ +package com.yuanchu.mom.dto; + + +import com.yuanchu.mom.pojo.AuxiliaryOutputWorkingHours; +import lombok.Data; + +import java.util.List; + +//妫�楠屼换鍔℃彁浜ゆ墍闇�鍙傛暟 +@Data +public class SubmitPlanDto { + + private Integer orderId; + + private String laboratory; + + private Integer verifyUser; + private String entrustCode; + private String note; + private String term; + + //浜ч噺宸ユ椂 + private List<AuxiliaryOutputWorkingHours> auxiliaryOutputWorkingHoursList; +} diff --git a/inspect-server/src/main/java/com/yuanchu/mom/service/InsOrderPlanService.java b/inspect-server/src/main/java/com/yuanchu/mom/service/InsOrderPlanService.java index 94e9cb8..8ccd69b 100644 --- a/inspect-server/src/main/java/com/yuanchu/mom/service/InsOrderPlanService.java +++ b/inspect-server/src/main/java/com/yuanchu/mom/service/InsOrderPlanService.java @@ -3,9 +3,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yuanchu.mom.dto.InsOrderPlanDTO; import com.yuanchu.mom.dto.InsProductResultDto; +import com.yuanchu.mom.dto.SubmitPlanDto; import com.yuanchu.mom.pojo.InsOrderFile; import com.yuanchu.mom.pojo.InsOrderUser; import com.yuanchu.mom.pojo.InsProduct; +import com.yuanchu.mom.pojo.InsProductResult; import com.yuanchu.mom.vo.InsProductResultVo; import org.springframework.web.multipart.MultipartFile; @@ -36,7 +38,7 @@ int verifyPlan(Integer orderId, String laboratory, Integer type, String tell) throws IOException; - int submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode, String note,String term); + int submitPlan(SubmitPlanDto submitPlanDto); List<InsProduct> getInsProduct(Integer id, Integer type, String laboratory, HttpServletRequest request); List<InsProduct> getInsProduct2(Integer id, Integer type, String laboratory, HttpServletRequest request,Integer num); @@ -61,4 +63,6 @@ //棰勮鏂囦欢 Object preview(Integer id) throws Exception; + + int saveInsContext3(InsProductResult insProductResult); } diff --git a/inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderPlanServiceImpl.java b/inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderPlanServiceImpl.java index 6f76b2e..ff49a1e 100644 --- a/inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderPlanServiceImpl.java +++ b/inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderPlanServiceImpl.java @@ -20,6 +20,7 @@ import com.yuanchu.mom.dto.InsOrderPlanDTO; import com.yuanchu.mom.dto.InsProductResultDto; import com.yuanchu.mom.dto.SampleProductDto; +import com.yuanchu.mom.dto.SubmitPlanDto; import com.yuanchu.mom.exception.ErrorException; import com.yuanchu.mom.mapper.*; import com.yuanchu.mom.pojo.*; @@ -32,6 +33,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; + import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.*; @@ -89,7 +91,7 @@ private String twoCode; @Resource - WordUtils wordUtils; + WordUtils wordUtils; @Resource private InsReportMapper insReportMapper; @@ -460,7 +462,7 @@ return stringBuilder.toString(); } - + //妯$増淇濆瓨妫�楠屽唴瀹� @Override public void saveInsContext(Map<String, Object> insContext, Integer num) { Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId"); @@ -590,67 +592,6 @@ insProductMapper.updateById(insProduct); insProductUserMapper.insert(new InsProductUser(null, userId, LocalDateTime.now(), insProduct.getId())); insProduct = insProductMapper.selectById(insProduct); - /*鐢熸垚浜ч噺宸ユ椂*/ - //鏌ヨ妫�楠屽崟淇℃伅 - InsOrder insOrder = insOrderMapper.selectById(insSampleMapper.selectById(insProduct.getInsSampleId()).getInsOrderId()); - //鏍¢獙濡傛灉杩欎釜浜鸿繖涓娴嬮」鐩凡缁忔坊鍔犺繃浜嗗垯涓嶉渶瑕佸啀鏂板 - //棣栧厛鍒ゆ柇褰撳墠浜虹殑褰撳墠鏃堕棿鏄惁鏄帓鐝椂闂村唴,濡傛灉涓嶆槸灏辨槸鍔犵彮 - LocalDateTime today = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT); - PerformanceShift performanceShift = performanceShiftMapper.selectOne(Wrappers.<PerformanceShift>lambdaQuery() - .eq(PerformanceShift::getUserId, userId) - .eq(PerformanceShift::getWorkTime, today)); - if (ObjectUtils.isNotEmpty(performanceShift)) { - ShiftTime shiftTime = shiftTimeMapper.selectOne(Wrappers.<ShiftTime>lambdaQuery().eq(ShiftTime::getShift, performanceShift.getShift())); - if (ObjectUtils.isNotEmpty(shiftTime)) { - DateTimeFormatter forma = DateTimeFormatter.ofPattern("HH:mm"); - LocalTime now = LocalTime.now(); - LocalTime startTime = LocalTime.parse(shiftTime.getStartTime(), forma); - LocalTime endTime = LocalTime.parse(shiftTime.getEndTime(), forma); - // 妫�鏌ュ綋鍓嶆椂闂存槸鍚﹀湪鑼冨洿鍐咃紙鍖呮嫭杈圭晫锛� - boolean isWithinRange; - if (endTime.isAfter(startTime)) { - // 涓嶈法澶╃殑鎯呭喌 - isWithinRange = !now.isBefore(startTime) && !now.isAfter(endTime); - } else { - // 璺ㄥぉ鐨勬儏鍐� - isWithinRange = !now.isBefore(startTime) || !now.isAfter(endTime); - } - if (ObjectUtils.isNotEmpty(insProduct.getManHour())) { - //鍏堝垹鍚庡姞(宸ユ椂璁板綍鏈�鍚庝竴娆′繚瀛樼殑鏃堕棿) - auxiliaryOutputWorkingHoursMapper.delete(Wrappers.<AuxiliaryOutputWorkingHours>lambdaQuery() - .eq(AuxiliaryOutputWorkingHours::getInsProductId, insProduct.getId())); - AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHours = new AuxiliaryOutputWorkingHours(); - if (isWithinRange) { - //鍦ㄦ椂闂村唴灏辨槸姝e父涓婄彮 - auxiliaryOutputWorkingHours.setOrderNo(insOrder.getEntrustCode());//闈炲姞鐝鎵樺崟鍙� - auxiliaryOutputWorkingHours.setWorkTime(insProduct.getManHour());//闈炲姞鐝伐鏃� - auxiliaryOutputWorkingHours.setAmount(1);//闈炲姞鐝暟閲� - auxiliaryOutputWorkingHours.setOutputWorkTime((ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getOvertimeWorkTime()) ? auxiliaryOutputWorkingHours.getOvertimeWorkTime() : 0) + (ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getWorkTime()) ? auxiliaryOutputWorkingHours.getWorkTime() : 0));//浜ч噺宸ユ椂 - - } else { - //鍔犵彮 - auxiliaryOutputWorkingHours.setOvertimeOrderNo(insOrder.getEntrustCode());//鍔犵彮濮旀墭鍗曞彿 - auxiliaryOutputWorkingHours.setOvertimeWorkTime(insProduct.getManHour());//鍔犵彮宸ユ椂 - auxiliaryOutputWorkingHours.setOvertimeAmount(1);//鍔犵彮鏁伴噺 - auxiliaryOutputWorkingHours.setOutputWorkTime((ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getOvertimeWorkTime()) ? auxiliaryOutputWorkingHours.getOvertimeWorkTime() : 0) + (ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getWorkTime()) ? auxiliaryOutputWorkingHours.getWorkTime() : 0));//浜ч噺宸ユ椂 - } - auxiliaryOutputWorkingHours.setInspectionItem(insProduct.getInspectionItem());//妫�娴嬬埗椤� - auxiliaryOutputWorkingHours.setInspectionItemSubclass(insProduct.getInspectionItemSubclass());//妫�娴嬪瓙椤� - auxiliaryOutputWorkingHours.setSample(insSampleMapper.selectById(insProduct.getInsSampleId()).getSampleCode());//鏍峰搧缂栧彿 - auxiliaryOutputWorkingHours.setManHourGroup(insProduct.getManHourGroup());//宸ユ椂鍒嗙粍 - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - auxiliaryOutputWorkingHours.setDateTime(LocalDateTime.now().toLocalDate().atStartOfDay().format(formatters));//鏃ユ湡 - LocalDateTime localDateTime = LocalDateTime.now(); - DateTime parse = DateUtil.parse(localDateTime.format(formatter)); - auxiliaryOutputWorkingHours.setWeekDay(getWeek(localDateTime.format(formatters)));//鏄熸湡 - auxiliaryOutputWorkingHours.setWeek(String.valueOf(DateUtil.weekOfYear(DateUtil.offsetDay(parse, 1))));//鍛ㄦ - auxiliaryOutputWorkingHours.setCheck(userId);//妫�娴嬩汉 - auxiliaryOutputWorkingHours.setInsProductId(insProduct.getId());//妫�楠岄」鐩甶d - auxiliaryOutputWorkingHoursMapper.insert(auxiliaryOutputWorkingHours); - } - } - } InsSample insSample = insSampleMapper.selectById(insProductMapper.selectById(insProduct.getId()).getInsSampleId()); insSample.setInsState(1); Long l = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery() @@ -758,12 +699,10 @@ if (!insProduct.getAsk().contains(",")) { if (insProduct.getAsk().equals("/")) { ressult = 3; //涓嶅垽瀹� - } - else if (!isValueValid(valueStr, new String[]{insProduct.getAsk()})) { + } else if (!isValueValid(valueStr, new String[]{insProduct.getAsk()})) { ressult = 0; //涓嶅悎鏍� } - } - else { + } else { // 濡傛灉瑕佹眰鍊兼槸(2掳鈮�20,7掳鈮�25,12掳鈮�25)杩欑鎯呭喌 String[] askParts = insProduct.getAsk().split(","); String[] angles = insProductResult2.getAngle().split(","); @@ -802,65 +741,6 @@ insProduct.setUpdateUser(userId); insProductMapper.updateById(insProduct); insProductUserMapper.insert(new InsProductUser(null, userId, LocalDateTime.now(), insProduct.getId())); - /*鐢熸垚浜ч噺宸ユ椂*/ - //鏍¢獙濡傛灉杩欎釜浜鸿繖涓娴嬮」鐩凡缁忔坊鍔犺繃浜嗗垯涓嶉渶瑕佸啀鏂板 - //棣栧厛鍒ゆ柇褰撳墠浜虹殑褰撳墠鏃堕棿鏄惁鏄帓鐝椂闂村唴,濡傛灉涓嶆槸灏辨槸鍔犵彮 - LocalDateTime today = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT); - PerformanceShift performanceShift = performanceShiftMapper.selectOne(Wrappers.<PerformanceShift>lambdaQuery() - .eq(PerformanceShift::getUserId, userId) - .eq(PerformanceShift::getWorkTime, today)); - if (ObjectUtils.isNotEmpty(performanceShift)) { - ShiftTime shiftTime = shiftTimeMapper.selectOne(Wrappers.<ShiftTime>lambdaQuery().eq(ShiftTime::getShift, performanceShift.getShift())); - if (ObjectUtils.isNotEmpty(shiftTime)) { - DateTimeFormatter forma = DateTimeFormatter.ofPattern("HH:mm"); - LocalTime now = LocalTime.now(); - LocalTime startTime = LocalTime.parse(shiftTime.getStartTime(), forma); - LocalTime endTime = LocalTime.parse(shiftTime.getEndTime(), forma); - // 妫�鏌ュ綋鍓嶆椂闂存槸鍚﹀湪鑼冨洿鍐咃紙鍖呮嫭杈圭晫锛� - boolean isWithinRange; - if (endTime.isAfter(startTime)) { - // 涓嶈法澶╃殑鎯呭喌 - isWithinRange = !now.isBefore(startTime) && !now.isAfter(endTime); - } else { - // 璺ㄥぉ鐨勬儏鍐� - isWithinRange = !now.isBefore(startTime) || !now.isAfter(endTime); - } - if (ObjectUtils.isNotEmpty(insProduct.getManHour())) { - //鍏堝垹鍚庡姞(宸ユ椂璁板綍鏈�鍚庝竴娆′繚瀛樼殑鏃堕棿) - auxiliaryOutputWorkingHoursMapper.delete(Wrappers.<AuxiliaryOutputWorkingHours>lambdaQuery() - .eq(AuxiliaryOutputWorkingHours::getInsProductId, insProduct.getId())); - AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHours = new AuxiliaryOutputWorkingHours(); - if (isWithinRange) { - //鍦ㄦ椂闂村唴灏辨槸姝e父涓婄彮 - auxiliaryOutputWorkingHours.setOrderNo(insOrder.getEntrustCode());//闈炲姞鐝鎵樺崟鍙� - auxiliaryOutputWorkingHours.setWorkTime(insProduct.getManHour());//闈炲姞鐝伐鏃� - auxiliaryOutputWorkingHours.setAmount(1);//闈炲姞鐝暟閲� - auxiliaryOutputWorkingHours.setOutputWorkTime((ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getOvertimeWorkTime()) ? auxiliaryOutputWorkingHours.getOvertimeWorkTime() : 0) + (ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getWorkTime()) ? auxiliaryOutputWorkingHours.getWorkTime() : 0));//浜ч噺宸ユ椂 - - } else { - //鍔犵彮 - auxiliaryOutputWorkingHours.setOvertimeOrderNo(insOrder.getEntrustCode());//鍔犵彮濮旀墭鍗曞彿 - auxiliaryOutputWorkingHours.setOvertimeWorkTime(insProduct.getManHour());//鍔犵彮宸ユ椂 - auxiliaryOutputWorkingHours.setOvertimeAmount(1);//鍔犵彮鏁伴噺 - auxiliaryOutputWorkingHours.setOutputWorkTime((ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getOvertimeWorkTime()) ? auxiliaryOutputWorkingHours.getOvertimeWorkTime() : 0) + (ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getWorkTime()) ? auxiliaryOutputWorkingHours.getWorkTime() : 0));//浜ч噺宸ユ椂 - } - auxiliaryOutputWorkingHours.setInspectionItem(insProduct.getInspectionItem());//妫�娴嬬埗椤� - auxiliaryOutputWorkingHours.setInspectionItemSubclass(insProduct.getInspectionItemSubclass());//妫�娴嬪瓙椤� - auxiliaryOutputWorkingHours.setSample(insSampleMapper.selectById(insProduct.getInsSampleId()).getSampleCode());//鏍峰搧缂栧彿 - auxiliaryOutputWorkingHours.setManHourGroup(insProduct.getManHourGroup());//宸ユ椂鍒嗙粍 - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - auxiliaryOutputWorkingHours.setDateTime(LocalDateTime.now().toLocalDate().atStartOfDay().format(formatters));//鏃ユ湡 - LocalDateTime localDateTime = LocalDateTime.now(); - DateTime parse = DateUtil.parse(localDateTime.format(formatter)); - auxiliaryOutputWorkingHours.setWeekDay(getWeek(localDateTime.format(formatters)));//鏄熸湡 - auxiliaryOutputWorkingHours.setWeek(String.valueOf(DateUtil.weekOfYear(DateUtil.offsetDay(parse, 1))));//鍛ㄦ - auxiliaryOutputWorkingHours.setCheck(userId);//妫�娴嬩汉 - auxiliaryOutputWorkingHours.setInsProductId(insProduct.getId());//妫�楠岄」鐩甶d - auxiliaryOutputWorkingHoursMapper.insert(auxiliaryOutputWorkingHours); - } - } - } /*鏇存柊鏍峰搧鐨勬楠岀姸鎬�*/ insSample.setInsState(1); Long l = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery() @@ -887,6 +767,17 @@ .set(InsOrderState::getInsState, 2)); } return list; + } + + //娓╂箍搴﹁瘯楠�+鍔熺巼璇曢獙鐨勪繚瀛樻楠屽唴瀹� + @Override + public int saveInsContext3(InsProductResult insProductResult) { + //鍏堝垹鍚庡姞 + insProductResultMapper.delete(Wrappers.<InsProductResult>lambdaQuery() + .eq(InsProductResult::getInsProductId, insProductResult.getInsProductId()) + .eq(InsProductResult::getNum, insProductResult.getNum())); + insProductResultMapper.insert(insProductResult); + return 0; } //瑙f瀽瑕佹眰鍊肩殑鏍煎紡 @@ -1079,12 +970,12 @@ } @Override - public int submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode, String note, String term) { + public int submitPlan(SubmitPlanDto submitPlanDto) { List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery() - .eq(InsSample::getInsOrderId, orderId).select(InsSample::getId)); + .eq(InsSample::getInsOrderId, submitPlanDto.getOrderId()).select(InsSample::getId)); InsOrderState orderState = insOrderStateMapper.selectOne(Wrappers.<InsOrderState>lambdaQuery() - .eq(InsOrderState::getInsOrderId, orderId) - .eq(InsOrderState::getLaboratory, laboratory) + .eq(InsOrderState::getInsOrderId, submitPlanDto.getOrderId()) + .eq(InsOrderState::getLaboratory, submitPlanDto.getLaboratory()) .orderByDesc(InsOrderState::getId) .last("LIMIT 1"));// 纭繚鍙彇涓�鏉¤褰� /*璁板綍妫�楠屼换鍔℃瘡娆$殑澶囨敞淇℃伅*/ @@ -1093,13 +984,13 @@ insOrderUser.setSubmitUser(getLook.selectPowerByMethodAndUserId(null).get("userId")); insOrderUser.setSubmitTime(LocalDateTime.now()); insOrderUser.setNum(orderState.getNum()); - insOrderUser.setNote(ObjectUtils.isNotEmpty(note) ? note : null); - insOrderUser.setTerm(ObjectUtils.isNotEmpty(term) ? term : null); + insOrderUser.setNote(ObjectUtils.isNotEmpty(submitPlanDto.getNote()) ? submitPlanDto.getNote() : null); + insOrderUser.setTerm(ObjectUtils.isNotEmpty(submitPlanDto.getTerm()) ? submitPlanDto.getTerm() : null); insOrderUserMapper.insert(insOrderUser); List<Integer> ids = insSamples.stream().map(a -> a.getId()).collect(Collectors.toList()); List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery() .in(InsProduct::getInsSampleId, ids) - .eq(InsProduct::getSonLaboratory, laboratory) + .eq(InsProduct::getSonLaboratory, submitPlanDto.getLaboratory()) .eq(InsProduct::getState, 1) .and(wrapper -> wrapper .isNull(InsProduct::getInsResult) @@ -1110,8 +1001,8 @@ String str = ""; int count = 0; for (InsProduct product : insProducts) { - //杈愬皠璇曢獙妫�娴嬬殑妫�楠岄」鐩�,涓嶉渶瑕佸幓鎵嬪姩濉啓妫�楠屽��,鍙渶瑕佷笂浼犺〃鏍兼枃浠跺氨鍙互浜�,鍚庡彴鎻愪氦鐨勬椂鍊欐牎楠岃烦杩囪繖涓楠岄」鐩� - if (product.getInspectionItem().equals("杈愬皠璇曢獙妫�娴�")) { + //杈愬皠璇曢獙,娓╂箍搴﹁瘯楠�,鍔熺巼璇曢獙鐨勬楠岄」鐩�,涓嶉渶瑕佸幓鎵嬪姩濉啓妫�楠屽��,鍙渶瑕佷笂浼犺〃鏍兼枃浠跺氨鍙互浜�,鍚庡彴鎻愪氦鐨勬椂鍊欐牎楠岃烦杩囪繖涓楠岄」鐩� + if (product.getInspectionItem().equals("杈愬皠璇曢獙") || product.getInspectionItem().equals("娓╂箍搴﹁瘯楠�") || product.getInspectionItem().equals("鍔熺巼璇曢獙")) { product.setInsResult(3);//涓嶅垽瀹� insProductMapper.updateById(product); continue; @@ -1137,10 +1028,10 @@ } } insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate() - .eq(InsOrderState::getInsOrderId, orderId) - .eq(InsOrderState::getLaboratory, laboratory) + .eq(InsOrderState::getInsOrderId, submitPlanDto.getOrderId()) + .eq(InsOrderState::getLaboratory, submitPlanDto.getLaboratory()) .set(InsOrderState::getInsState, 3) - .set(InsOrderState::getVerifyUser, verifyUser)); + .set(InsOrderState::getVerifyUser, submitPlanDto.getVerifyUser())); /*杩欎釜鎯呭喌鍏堝叧闂�----濡傛灉鏄疌绫昏鍗曚笖鏄笅鍙戝埌璐ㄩ噺閮�,鍒欑洿鎺ュ鏍搁�氳繃(缁撴潫璇曢獙)*/ // InsOrder insOrder = insOrderMapper.selectById(orderId); // if (insOrder.getOrderType().equals("C") && insOrder.getDepartmentLims().equals("璐ㄩ噺閮�")) { @@ -1150,19 +1041,19 @@ // e.printStackTrace(); // } // } else { - Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId"); - //LIMS绯荤粺娑堟伅鎺ㄩ�� - InformationNotification info = new InformationNotification(); - info.setCreateUser(insProductMapper.selectUserById(userId).get("name")); - info.setMessageType("2"); - info.setTheme("澶嶆牳閫氱煡"); - info.setContent("鎮ㄦ湁涓�鏉℃楠屼换鍔″緟澶嶆牳娑堟伅"); - info.setSenderId(userId); - info.setConsigneeId(verifyUser); - info.setViewStatus(false); - info.setJumpPath("b1-inspect-order-plan"); - informationNotificationService.addInformationNotification(info); - //todo 浼佷笟寰俊娑堟伅鎺ㄩ�丂zss + Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId"); + //LIMS绯荤粺娑堟伅鎺ㄩ�� + InformationNotification info = new InformationNotification(); + info.setCreateUser(insProductMapper.selectUserById(userId).get("name")); + info.setMessageType("2"); + info.setTheme("澶嶆牳閫氱煡"); + info.setContent("鎮ㄦ湁涓�鏉℃楠屼换鍔″緟澶嶆牳娑堟伅"); + info.setSenderId(userId); + info.setConsigneeId(submitPlanDto.getVerifyUser()); + info.setViewStatus(false); + info.setJumpPath("b1-inspect-order-plan"); + informationNotificationService.addInformationNotification(info); + //todo 浼佷笟寰俊娑堟伅鎺ㄩ�丂zss /* HashMap<String, Object> map = new HashMap<>(); String account = userMapper.selectById(userId).getAccount(); map.put("touser", *//*account*//*"ZT-012117");//鎺ユ敹娑堟伅鎴愬憳鐨勮处鍙�'ZT-031292'杩欑绫诲瀷(濡傛灉鏈夊涓敤'|'鍒嗛殧) @@ -1180,12 +1071,12 @@ // } //澶嶆牳浜�--妫�楠屽崟鐩稿叧璐熻矗浜� InsSampleUser insSampleUser = new InsSampleUser(); - insSampleUser.setUserId(verifyUser); - insSampleUser.setInsSampleId(orderId); + insSampleUser.setUserId(submitPlanDto.getVerifyUser()); + insSampleUser.setInsSampleId(submitPlanDto.getOrderId()); insSampleUser.setState(1); - insSampleUser.setSonLaboratory(laboratory); + insSampleUser.setSonLaboratory(submitPlanDto.getLaboratory()); insSampleUserMapper.insert(insSampleUser); - /*鏍¢獙涓�涓媟esult琛�*/ + /*//鏍¢獙涓�涓媟esult琛� CompletableFuture.supplyAsync(() -> { List<Integer> ips = insProducts.stream().map(InsProduct::getId).distinct().collect(Collectors.toList()); for (Integer ip : ips) { @@ -1199,19 +1090,70 @@ } } return null; - }); + });*/ /*鐢熸垚鐢佃矾璇曢獙鐨勭珯鐐规姤鍛婂苟涓婁紶鍒伴檮浠朵腑*/ - if (laboratory.equals("鐢佃矾璇曢獙")) { - wordUtils.generateWord(note, term, orderState); -// try { -// wordUtils.generateWord(note, term, orderState); -// }catch (Exception e){ -// throw new ErrorException("鐢佃矾璇曢獙鐨勭珯鐐规姤鍛婄敓鎴愭湁璇�,璇疯仈绯诲紑鍙戜汉鍛樿皟鏁�!"); -// } + if (submitPlanDto.getLaboratory().equals("鐢佃矾璇曢獙")) { + try { + wordUtils.generateWord(submitPlanDto.getNote(), submitPlanDto.getTerm(), orderState); + } catch (Exception e) { + throw new ErrorException("鐢佃矾璇曢獙鐨勭珯鐐规姤鍛婄敓鎴愭湁璇�,璇疯仈绯诲紑鍙戜汉鍛樿皟鏁�!"); + } } - // 鍒犻櫎鏁伴噰閲囬泦娆℃暟 - String key = "frequency" + ":" + entrustCode + ":*"; - RedisUtil.delsLike(key); + /*// 鍒犻櫎鏁伴噰閲囬泦娆℃暟 + String key = "frequency" + ":" + submitPlanDto.getEntrustCode() + ":*"; + RedisUtil.delsLike(key);*/ + + /*鐢熸垚浜ч噺宸ユ椂*/ + //鏌ヨ妫�楠屽崟淇℃伅 + InsOrder insOrder = insOrderMapper.selectById(submitPlanDto.getOrderId()); + //鏍¢獙濡傛灉杩欎釜浜鸿繖涓娴嬮」鐩凡缁忔坊鍔犺繃浜嗗垯涓嶉渶瑕佸啀鏂板 + //棣栧厛鍒ゆ柇褰撳墠浜虹殑褰撳墠鏃堕棿鏄惁鏄帓鐝椂闂村唴,濡傛灉涓嶆槸灏辨槸鍔犵彮 + LocalDateTime today = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT); + PerformanceShift performanceShift = performanceShiftMapper.selectOne(Wrappers.<PerformanceShift>lambdaQuery() + .eq(PerformanceShift::getUserId, userId) + .eq(PerformanceShift::getWorkTime, today)); + if (ObjectUtils.isNotEmpty(performanceShift)) { + ShiftTime shiftTime = shiftTimeMapper.selectOne(Wrappers.<ShiftTime>lambdaQuery().eq(ShiftTime::getShift, performanceShift.getShift())); + if (ObjectUtils.isNotEmpty(shiftTime)) { + DateTimeFormatter forma = DateTimeFormatter.ofPattern("HH:mm"); + LocalTime now = LocalTime.now(); + LocalTime startTime = LocalTime.parse(shiftTime.getStartTime(), forma); + LocalTime endTime = LocalTime.parse(shiftTime.getEndTime(), forma); + // 妫�鏌ュ綋鍓嶆椂闂存槸鍚﹀湪鑼冨洿鍐咃紙鍖呮嫭杈圭晫锛� + boolean isWithinRange; + if (endTime.isAfter(startTime)) { + // 涓嶈法澶╃殑鎯呭喌 + isWithinRange = !now.isBefore(startTime) && !now.isAfter(endTime); + } else { + // 璺ㄥぉ鐨勬儏鍐� + isWithinRange = !now.isBefore(startTime) || !now.isAfter(endTime); + } + for (AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHours : submitPlanDto.getAuxiliaryOutputWorkingHoursList()) { + InsProduct insProduct = insProductMapper.selectById(auxiliaryOutputWorkingHours.getInsProductId()); + if (isWithinRange) { + //鍦ㄦ椂闂村唴灏辨槸姝e父涓婄彮 + auxiliaryOutputWorkingHours.setOrderNo(insOrder.getEntrustCode());//闈炲姞鐝鎵樺崟鍙� + auxiliaryOutputWorkingHours.setWorkTime(auxiliaryOutputWorkingHours.getOutputWorkTime());//闈炲姞鐝伐鏃� + auxiliaryOutputWorkingHours.setAmount(1);//闈炲姞鐝暟閲� + } else { + //鍔犵彮 + auxiliaryOutputWorkingHours.setOvertimeOrderNo(insOrder.getEntrustCode());//鍔犵彮濮旀墭鍗曞彿 + auxiliaryOutputWorkingHours.setOvertimeWorkTime(auxiliaryOutputWorkingHours.getOutputWorkTime());//鍔犵彮宸ユ椂 + auxiliaryOutputWorkingHours.setOvertimeAmount(1);//鍔犵彮鏁伴噺 + } + auxiliaryOutputWorkingHours.setManHourGroup(insProduct.getManHourGroup());//宸ユ椂鍒嗙粍 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + auxiliaryOutputWorkingHours.setDateTime(LocalDateTime.now().toLocalDate().atStartOfDay().format(formatters));//鏃ユ湡 + LocalDateTime localDateTime = LocalDateTime.now(); + DateTime parse = DateUtil.parse(localDateTime.format(formatter)); + auxiliaryOutputWorkingHours.setWeekDay(getWeek(localDateTime.format(formatters)));//鏄熸湡 + auxiliaryOutputWorkingHours.setWeek(String.valueOf(DateUtil.weekOfYear(DateUtil.offsetDay(parse, 1))));//鍛ㄦ + auxiliaryOutputWorkingHours.setCheck(userId);//妫�娴嬩汉 + auxiliaryOutputWorkingHoursMapper.insert(auxiliaryOutputWorkingHours); + } + } + } return 1; } @@ -1250,6 +1192,4 @@ return "鏈煡"; } } - - } diff --git a/inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderServiceImpl.java b/inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderServiceImpl.java index e1d1bc2..e74f015 100644 --- a/inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderServiceImpl.java +++ b/inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderServiceImpl.java @@ -504,15 +504,15 @@ List<Integer> list = Arrays.stream(ids.split(",")).map(Integer::parseInt).collect(Collectors.toList()); List<SampleProductDto3> sampleProductDtos = insSampleMapper.selectSampleProductListByOrderId3(list); Set<String> processedCodes = new HashSet<>(); - List<SampleProductDto3> sampleProductDto3s = sampleProductDtos.stream().filter(sampleProductDto3 -> { + /* List<SampleProductDto3> sampleProductDto3s = sampleProductDtos.stream().filter(sampleProductDto3 -> { if (processedCodes.contains(sampleProductDto3.getCode())) { return false; } else { processedCodes.add(sampleProductDto3.getCode()); return true; } - }).collect(Collectors.toList()); - return sampleProductDto3s; + }).collect(Collectors.toList());*/ + return sampleProductDtos; } //鏍¢獙鐢垫満缂栧彿 diff --git a/inspect-server/src/main/resources/mapper/InsSampleMapper.xml b/inspect-server/src/main/resources/mapper/InsSampleMapper.xml index 46551d7..31aa13f 100644 --- a/inspect-server/src/main/resources/mapper/InsSampleMapper.xml +++ b/inspect-server/src/main/resources/mapper/InsSampleMapper.xml @@ -536,6 +536,7 @@ ip.sample ip_sample, ip.model ip_model, ip.state, + io.issue_time, ins_sample_id from ins_sample isa left join ins_product ip on isa.id = ip.ins_sample_id @@ -619,7 +620,7 @@ and ios.laboratory = #{laboratory} and (ipr2.num = ios.num or ipr2.num is null) and (ipr.num = ios.num or ipr.num is null) - order by ipr.id, ipr2.id + order by ip.id, ipr.id, ipr2.id </select> <select id="getIns2Product1" resultMap="product"> select ip.id ip_id, @@ -685,7 +686,7 @@ and ip.son_laboratory = #{laboratory} and ip.standard_method_list_id is not null and ios.laboratory = #{laboratory} - order by ipr.id, ipr2.id + order by ip.id, ipr.id, ipr2.id </select> <select id="get2InsProduct1" resultMap="product"> select ip.id ip_id, @@ -752,7 +753,7 @@ and ip.standard_method_list_id is not null and ios.laboratory = #{laboratory} and (ipr2.num = #{num} or ipr.num = #{num}) - order by ipr.id, ipr2.id + order by ip.id, ipr.id, ipr2.id </select> <select id="getReportModel" resultType="java.util.Map"> @@ -851,6 +852,7 @@ <result property="insState" column="ins_state" jdbcType="INTEGER"/> <result property="joinNum" column="join_num" jdbcType="INTEGER"/> <result property="remark" column="remark" jdbcType="VARCHAR"/> + <result property="issueTime" column="issue_time" /> <result property="createUser" column="create_user" jdbcType="INTEGER"/> <result property="updateUser" column="update_user" jdbcType="INTEGER"/> <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> @@ -931,7 +933,8 @@ and ip.id is not null </select> <select id="selectInsSample" resultType="com.yuanchu.mom.pojo.InsSample"> - select isa.*,entrust_code + select isa.*, + case when entrust_code is null then out_entrust_code else entrust_code end as entrust_code from ins_sample isa left join ins_order io on isa.ins_order_id = io.id where ins_order_id in diff --git a/performance-server/src/main/java/com/yuanchu/mom/pojo/AuxiliaryOutputWorkingHours.java b/performance-server/src/main/java/com/yuanchu/mom/pojo/AuxiliaryOutputWorkingHours.java index 7e8cf42..71b43ff 100644 --- a/performance-server/src/main/java/com/yuanchu/mom/pojo/AuxiliaryOutputWorkingHours.java +++ b/performance-server/src/main/java/com/yuanchu/mom/pojo/AuxiliaryOutputWorkingHours.java @@ -49,32 +49,32 @@ @ApiModelProperty("鍔犵彮濮旀墭鍗曞彿") @ExcelProperty(value = "鍔犵彮濮旀墭鍗曞彿") - @ValueTableShow(3) + @ValueTableShow(6) private String overtimeOrderNo; @ApiModelProperty("鍔犵彮宸ユ椂") @ExcelProperty(value = "鍔犵彮宸ユ椂") - @ValueTableShow(4) + @ValueTableShow(7) private Double overtimeWorkTime; @ApiModelProperty("鍔犵彮鏁伴噺") @ExcelProperty(value = "鍔犵彮鏁伴噺") - @ValueTableShow(5) + @ValueTableShow(8) private Integer overtimeAmount; @ApiModelProperty("闈炲姞鐝鎵樺崟鍙�") @ExcelProperty(value = "闈炲姞鐝鎵樺崟鍙�") - @ValueTableShow(6) + @ValueTableShow(3) private String orderNo; @ApiModelProperty("闈炲姞鐝伐鏃�") @ExcelProperty(value = "闈炲姞鐝伐鏃�") - @ValueTableShow(7) + @ValueTableShow(4) private Double workTime; @ApiModelProperty("闈炲姞鐝暟閲�") @ExcelProperty(value = "闈炲姞鐝暟閲�") - @ValueTableShow(8) + @ValueTableShow(5) private Integer amount; @ApiModelProperty("浜ч噺宸ユ椂") @@ -131,4 +131,9 @@ @ApiModelProperty("妫�楠岄」鐩甶d") @ExcelIgnore private Integer insProductId; + + @ApiModelProperty("妫�娴嬫鏁�") + @ExcelProperty(value = "妫�娴嬫鏁�") + @ValueTableShow(2) + private Integer num; } diff --git a/performance-server/src/main/java/com/yuanchu/mom/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java b/performance-server/src/main/java/com/yuanchu/mom/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java index 131200a..8ddd353 100644 --- a/performance-server/src/main/java/com/yuanchu/mom/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java +++ b/performance-server/src/main/java/com/yuanchu/mom/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java @@ -202,13 +202,14 @@ auxiliaryWorkingHoursDays = auxiliaryWorkingHoursDayMapper.selectListByIds(ids); } if (ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours)) { - Map<String, Double> sumMap = new HashMap<>(); +// Map<String, Double> sumMap = new HashMap<>(); for (AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHour : auxiliaryOutputWorkingHours) { - if (!sumMap.containsKey(auxiliaryOutputWorkingHour.getManHourGroup()+auxiliaryOutputWorkingHour.getOrderNo()+auxiliaryOutputWorkingHour.getSample())) { + /* if (!sumMap.containsKey(auxiliaryOutputWorkingHour.getManHourGroup()+auxiliaryOutputWorkingHour.getOrderNo()+auxiliaryOutputWorkingHour.getSample())) { sumMap.put(auxiliaryOutputWorkingHour.getManHourGroup()+auxiliaryOutputWorkingHour.getOrderNo()+auxiliaryOutputWorkingHour.getSample(), auxiliaryOutputWorkingHour.getOutputWorkTime()); - } + }*/ + sumOutputWorkTime+=auxiliaryOutputWorkingHour.getOutputWorkTime(); } - sumOutputWorkTime = sumMap.values().stream().mapToDouble(Double::doubleValue).sum(); +// sumOutputWorkTime = sumMap.values().stream().mapToDouble(Double::doubleValue).sum(); } map.put("浜ч噺宸ユ椂姹囨��", sumOutputWorkTime); if (ObjectUtils.isNotEmpty(auxiliaryWorkingHoursDays)) { diff --git a/performance-server/src/main/resources/mapper/AuxiliaryOutputWorkingHoursMapper.xml b/performance-server/src/main/resources/mapper/AuxiliaryOutputWorkingHoursMapper.xml index 532522c..b37e74b 100644 --- a/performance-server/src/main/resources/mapper/AuxiliaryOutputWorkingHoursMapper.xml +++ b/performance-server/src/main/resources/mapper/AuxiliaryOutputWorkingHoursMapper.xml @@ -28,6 +28,7 @@ from ( select aowh.id, inspection_item, + num, inspection_item_subclass, overtime_order_no, overtime_work_time, @@ -74,15 +75,10 @@ from( select user.name, date_time as month, - order_no, - sample, - man_hour_group, case when #{type}='鍔犵彮宸ユ椂' then case when overtime_work_time is null then 0 else overtime_work_time end else case when work_time is null then 0 else work_time end end as manHours - -- FORMAT(SUM(output_work_time), 4) as manHours from auxiliary_output_working_hours aowh left join user on user.id=aowh.`check` - left join department_lims dl on depart_lims_id=dl.id where date_time LIKE CONCAT('%', #{month}, '%') <if test="ids !=null and ids != ''"> and `check` in @@ -90,12 +86,7 @@ #{val} </foreach> </if> - group by user.name,date_time,order_no, - sample, - man_hour_group - order by user.name,date_time,order_no, - sample, - man_hour_group + order by user.name,date_time )A group by A.name, A.month -- Gitblit v1.9.3