Browse Source

长期待摊费用分配表111

zhouli 10 months ago
parent
commit
eea103af55

BIN
doc/xls导入模板/每月研发工时记录表.xls


+ 15 - 0
kd-auth/src/main/resources/application-home.yml

@@ -0,0 +1,15 @@
+#服务器端口
+server:
+  port: 8100
+
+#数据源配置
+spring:
+  datasource:
+    url: ${kd.datasource.test.url}
+    username: ${kd.datasource.test.username}
+    password: ${kd.datasource.test.password}
+
+#第三方登陆
+social:
+  enabled: true
+  domain: http://127.0.0.1:2888

+ 5 - 3
kd-common/src/main/java/org/sky/common/constant/LauncherConstant.java

@@ -27,9 +27,9 @@ public interface LauncherConstant {
 
 
 	String NACOS_DEV_NAMESPACE = "bc98aa53-bc32-4e17-bb82-605c8e95d336";
 	String NACOS_DEV_NAMESPACE = "bc98aa53-bc32-4e17-bb82-605c8e95d336";
 
 
-//	String NACOS_DEV_ADDR = "127.0.0.1:8848";
-//
-//	String NACOS_DEV_NAMESPACE = "bc98aa53-bc32-4e17-bb82-605c8e95d336";
+	String NACOS_HOME_ADDR = "47.99.150.200:8848";
+
+	String NACOS_HOME_NAMESPACE = "9f24a600-102c-48f2-9e42-ac850986db45";
 
 
 	/**
 	/**
 	 * nacos prod 地址
 	 * nacos prod 地址
@@ -144,6 +144,7 @@ public interface LauncherConstant {
 		return switch (profile) {
 		return switch (profile) {
 			case (AppConstant.PROD_CODE) -> NACOS_PROD_ADDR;
 			case (AppConstant.PROD_CODE) -> NACOS_PROD_ADDR;
 			case (AppConstant.TEST_CODE) -> NACOS_TEST_ADDR;
 			case (AppConstant.TEST_CODE) -> NACOS_TEST_ADDR;
+			case (AppConstant.HOME_CODE) -> NACOS_HOME_ADDR;
 			default -> NACOS_DEV_ADDR;
 			default -> NACOS_DEV_ADDR;
 		};
 		};
 	}
 	}
@@ -152,6 +153,7 @@ public interface LauncherConstant {
 		return switch (profile) {
 		return switch (profile) {
 			case (AppConstant.PROD_CODE) -> NACOS_PROD_NAMESPACE;
 			case (AppConstant.PROD_CODE) -> NACOS_PROD_NAMESPACE;
 			case (AppConstant.TEST_CODE) -> NACOS_TEST_NAMESPACE;
 			case (AppConstant.TEST_CODE) -> NACOS_TEST_NAMESPACE;
+			case (AppConstant.HOME_CODE) -> NACOS_HOME_NAMESPACE;
 			default -> NACOS_DEV_NAMESPACE;
 			default -> NACOS_DEV_NAMESPACE;
 		};
 		};
 	}
 	}

+ 9 - 0
kd-ops/kd-log/src/main/resources/application-home.yml

@@ -0,0 +1,9 @@
+#数据源配置
+server:
+  port: 8103
+
+spring:
+  datasource:
+    url: ${kd.datasource.home.url}
+    username: ${kd.datasource.home.username}
+    password: ${kd.datasource.home.password}

+ 6 - 26
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/XmTechnicianHoursListener.java

@@ -41,36 +41,16 @@ public class XmTechnicianHoursListener implements ReadListener<Map<Integer, Stri
 			.forEach(entry -> {
 			.forEach(entry -> {
 				BigDecimal numberValue = entry.getValue().getNumberValue();
 				BigDecimal numberValue = entry.getValue().getNumberValue();
 				if (numberValue != null) {
 				if (numberValue != null) {
-					String str = getDay(numberValue);
-//					int day = Integer.parseInt(str);
-//					headers.add(day<= 9 ? "0" + day : day + "");
+					String str = formatExcelDate(numberValue.intValue());
 					headers.add(str);
 					headers.add(str);
 				}
 				}
 			});
 			});
 		return headers;
 		return headers;
 	}
 	}
-	public static String getDay(BigDecimal bd) {
-		//如果不是数字
-//		if(!isNumeric(daysDuration)){
-//			return null;
-//		}
-		//如果是数字 小于0则 返回
-//		BigDecimal bd = new BigDecimal(daysDuration);
-		int days = bd.intValue();//天数
-		int mills = (int) Math.round(bd.subtract(new BigDecimal(days)).doubleValue() * 24 * 3600);
-
-		//获取时间
-		Calendar c = Calendar.getInstance();
-		c.set(1900, 0, 0);
-		c.add(Calendar.DATE, days);
-		int hour = mills / 3600;
-		int minute = (mills - hour * 3600) / 60;
-		int second = mills - hour * 3600 - minute * 60;
-		c.set(Calendar.HOUR_OF_DAY, hour);
-		c.set(Calendar.MINUTE, minute);
-		c.set(Calendar.SECOND, second);
-
-		return DateUtil.format(c.getTime(), DateUtil.PATTERN_DATE);
+	public static String formatExcelDate(int day){
+		Calendar calendar = new GregorianCalendar(1900,0,-1);
+		Date date = calendar.getTime();
+		return DateUtil.format(DateUtil.plusDays(date, day), "yyyyMMdd");
 	}
 	}
 
 
 	@Override
 	@Override
@@ -102,7 +82,7 @@ public class XmTechnicianHoursListener implements ReadListener<Map<Integer, Stri
 			if (hoursStr != null && !hoursStr.trim().isEmpty()) {
 			if (hoursStr != null && !hoursStr.trim().isEmpty()) {
 				try {
 				try {
 					DailyAttendance daily = new DailyAttendance();
 					DailyAttendance daily = new DailyAttendance();
-					daily.setWorkDate(yearAndMonth + dateHeaders.get(i));
+					daily.setWorkDate(dateHeaders.get(i));
 					daily.setWorkHours(safeParseDouble(hoursStr));
 					daily.setWorkHours(safeParseDouble(hoursStr));
 					record.getDailyAttendances().add(daily);
 					record.getDailyAttendances().add(daily);
 				} catch (NumberFormatException e) {
 				} catch (NumberFormatException e) {

+ 0 - 2
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmTechnicianMapper.java

@@ -49,6 +49,4 @@ public interface XmTechnicianMapper extends BaseMapper<XmTechnicianEntity> {
 	 * @return
 	 * @return
 	 */
 	 */
 	List<XmTechnicianSummary> xmTechnicianSummaryByYear(IPage<XmTechnicianSummary> page, @Param("ew") XmTechnicianEntity entity);
 	List<XmTechnicianSummary> xmTechnicianSummaryByYear(IPage<XmTechnicianSummary> page, @Param("ew") XmTechnicianEntity entity);
-
-	String countByXmIdAndNumberAndIdCardAndYearMonth(@Param("xmId") Long xmId, @Param("number") String number, @Param("idCard") String idCard, @Param("yearMonth") String yearMonth);
 }
 }

+ 0 - 6
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmTechnicianMapper.xml

@@ -110,10 +110,4 @@
         <if test="ew.xmmc!=null and ew.xmmc!=''">and xm.XMMC like concat('%',#{ew.xmmc},'%')</if>
         <if test="ew.xmmc!=null and ew.xmmc!=''">and xm.XMMC like concat('%',#{ew.xmmc},'%')</if>
         GROUP BY m.xm_id,m.unicode
         GROUP BY m.xm_id,m.unicode
     </select>
     </select>
-
-    <select id="countByXmIdAndNumberAndIdCardAndYearMonth" resultType="java.lang.String">
-        SELECT distinct(unicode)
-        FROM kd_xm_technician m
-        where xm_id = #{xmId} and year_and_month = #{yearMonth} and unicode = (select DISTINCT(unicode) from kd_technician t on t.number = #{number} and t.id_card = #{idCard})
-    </select>
 </mapper>
 </mapper>

+ 18 - 9
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmTechnicianHoursServiceImpl.java

@@ -17,10 +17,7 @@ import org.sky.core.tool.utils.Func;
 import org.sky.core.tool.utils.StringUtil;
 import org.sky.core.tool.utils.StringUtil;
 import org.sky.scientific.excel.XmTechnicianHoursExcel;
 import org.sky.scientific.excel.XmTechnicianHoursExcel;
 import org.sky.scientific.excel.XmTechnicianHoursListener;
 import org.sky.scientific.excel.XmTechnicianHoursListener;
-import org.sky.scientific.mapper.AttendanceMapper;
-import org.sky.scientific.mapper.XmMapper;
-import org.sky.scientific.mapper.XmTechnicianHoursMapper;
-import org.sky.scientific.mapper.XmTechnicianMapper;
+import org.sky.scientific.mapper.*;
 import org.sky.scientific.pojo.entity.XmTechnicianHours;
 import org.sky.scientific.pojo.entity.XmTechnicianHours;
 import org.sky.scientific.pojo.vo.DailyAttendance;
 import org.sky.scientific.pojo.vo.DailyAttendance;
 import org.sky.scientific.pojo.vo.XmTechnicianHoursVO;
 import org.sky.scientific.pojo.vo.XmTechnicianHoursVO;
@@ -47,6 +44,7 @@ public class XmTechnicianHoursServiceImpl extends BaseServiceImpl<XmTechnicianHo
 	private final XmMapper xmMapper;
 	private final XmMapper xmMapper;
 	private final XmTechnicianMapper xmTechnicianMapper;
 	private final XmTechnicianMapper xmTechnicianMapper;
 	private final AttendanceMapper attendanceMapper;
 	private final AttendanceMapper attendanceMapper;
+	private final TechnicianMapper technicianMapper;
 
 
 	@SneakyThrows
 	@SneakyThrows
 	@Transactional(rollbackFor = Exception.class)
 	@Transactional(rollbackFor = Exception.class)
@@ -100,7 +98,7 @@ public class XmTechnicianHoursServiceImpl extends BaseServiceImpl<XmTechnicianHo
 			if (technicianMap.containsKey(techniciankey)) {
 			if (technicianMap.containsKey(techniciankey)) {
 				unicode = technicianMap.get(techniciankey);
 				unicode = technicianMap.get(techniciankey);
 			} else {
 			} else {
-				unicode = xmTechnicianMapper.countByXmIdAndNumberAndIdCardAndYearMonth(xmId, record.getNumber(), record.getIdCard(), yearAndMonth);
+				unicode = technicianMapper.getUnicodeByNumberAndIdentityCard(record.getNumber(), record.getIdCard());
 				if (unicode == null) {
 				if (unicode == null) {
 					throw new ServiceException("序号为[" + record.getSerialNumber() + "]的研发人员不存在");
 					throw new ServiceException("序号为[" + record.getSerialNumber() + "]的研发人员不存在");
 				}
 				}
@@ -121,16 +119,24 @@ public class XmTechnicianHoursServiceImpl extends BaseServiceImpl<XmTechnicianHo
 			Map<String, Double> hoursByDateMap = dailyAttendanceList.stream().collect(Collectors.groupingBy(DailyAttendance::getWorkDate, Collectors.summingDouble(DailyAttendance::getWorkHours)));
 			Map<String, Double> hoursByDateMap = dailyAttendanceList.stream().collect(Collectors.groupingBy(DailyAttendance::getWorkDate, Collectors.summingDouble(DailyAttendance::getWorkHours)));
 
 
 			//按人员筛选、根据日期分组,再对工时求和
 			//按人员筛选、根据日期分组,再对工时求和
- 			Map<String, Double> usedByUnicodeAndDateMap = dbList.stream().filter(e -> e.getUnicode().equals(finalUnicode)).collect(Collectors.groupingBy(XmTechnicianHours::getWorkDate, Collectors.summingDouble(XmTechnicianHours::getWorkHours)));
+			Map<String, Double> usedByUnicodeAndDateMap = dbList.stream().filter(e -> e.getUnicode().equals(finalUnicode)).collect(Collectors.groupingBy(XmTechnicianHours::getWorkDate, Collectors.summingDouble(XmTechnicianHours::getWorkHours)));
 
 
 			for (DailyAttendance dailyAttendance : record.getDailyAttendances()) {
 			for (DailyAttendance dailyAttendance : record.getDailyAttendances()) {
 
 
+
+				Double hoursTotal = hoursByDateMap.get(dailyAttendance.getWorkDate());
+				if (hoursTotal == null || hoursTotal <= 0) {
+					throw new ServiceException(dailyAttendance.getWorkDate() + "当天无考勤数据");
+				}
 				Double usedHours = usedByUnicodeAndDateMap.get(dailyAttendance.getWorkDate());
 				Double usedHours = usedByUnicodeAndDateMap.get(dailyAttendance.getWorkDate());
-				if (hoursByDateMap.get(dailyAttendance.getWorkDate()) - usedHours < dailyAttendance.getWorkHours()) {
+				if(usedHours==null){
+					usedHours = 0.0;
+				}
+				if (hoursTotal - usedHours < dailyAttendance.getWorkHours()) {
 					//当 考勤时长 - 当天以用工时 < 新的工时 ,则提示“考勤时长不足”
 					//当 考勤时长 - 当天以用工时 < 新的工时 ,则提示“考勤时长不足”
-					throw new ServiceException("考勤总时长为" + hoursByDateMap.get(dailyAttendance.getWorkDate()) + "小时,工时已用" + usedHours + "小时,请核对数据");
+					throw new ServiceException("[序号"+record.getSerialNumber()+",日期"+dailyAttendance.getWorkDate()+"工时"+dailyAttendance.getWorkHours()+"]的考勤时长不足,出勤总时长" + hoursTotal + ",已用" + usedHours + ",可用"+(hoursTotal-usedHours)+",请核对数据");
 				}
 				}
- 				List<Long> primaryKeyList = byXmAndUnicodeList.stream().filter(e -> Objects.equals(e.getWorkDate(), dailyAttendance.getWorkDate()) && Objects.equals(e.getXmId(), finalXmId) && Objects.equals(e.getUnicode(), finalUnicode)).map(XmTechnicianHours::getId).toList();
+				List<Long> primaryKeyList = byXmAndUnicodeList.stream().filter(e -> Objects.equals(e.getWorkDate(), dailyAttendance.getWorkDate()) && Objects.equals(e.getXmId(), finalXmId) && Objects.equals(e.getUnicode(), finalUnicode)).map(XmTechnicianHours::getId).toList();
 				Long primaryKey = CollectionUtil.isEmpty(primaryKeyList) ? null : primaryKeyList.get(0);
 				Long primaryKey = CollectionUtil.isEmpty(primaryKeyList) ? null : primaryKeyList.get(0);
 				XmTechnicianHours entity = new XmTechnicianHours();
 				XmTechnicianHours entity = new XmTechnicianHours();
 				if (primaryKey == null) {
 				if (primaryKey == null) {
@@ -219,6 +225,9 @@ public class XmTechnicianHoursServiceImpl extends BaseServiceImpl<XmTechnicianHo
 		for (DailyAttendance dailyAttendance : dto.getDailyAttendances()) {
 		for (DailyAttendance dailyAttendance : dto.getDailyAttendances()) {
 			//查询一天的考勤时长
 			//查询一天的考勤时长
 			double attendanceHours = dailyAttendanceList.stream().filter(e -> Objects.equals(e.getWorkDate(), dailyAttendance.getWorkDate())).mapToDouble(DailyAttendance::getWorkHours).sum();
 			double attendanceHours = dailyAttendanceList.stream().filter(e -> Objects.equals(e.getWorkDate(), dailyAttendance.getWorkDate())).mapToDouble(DailyAttendance::getWorkHours).sum();
+			if (attendanceHours <= 0) {
+				throw new ServiceException(dailyAttendance.getWorkDate() + "当天无考勤数据");
+			}
 			//查询一天所有项目的工时总和
 			//查询一天所有项目的工时总和
 			double hoursTotal = dbList.stream().filter(e -> Objects.equals(e.getWorkDate(), dailyAttendance.getWorkDate())).mapToDouble(XmTechnicianHours::getWorkHours).sum();
 			double hoursTotal = dbList.stream().filter(e -> Objects.equals(e.getWorkDate(), dailyAttendance.getWorkDate())).mapToDouble(XmTechnicianHours::getWorkHours).sum();
 
 

+ 10 - 0
kd-service/kd-scientific/src/main/resources/application-home.yml

@@ -0,0 +1,10 @@
+#服务器端口
+server:
+  port: 8200
+
+#数据源配置
+spring:
+  datasource:
+    url: ${kd.datasource.test.url}
+    username: ${kd.datasource.test.username}
+    password: ${kd.datasource.test.password}

+ 10 - 0
kd-service/kd-system/src/main/resources/application-home.yml

@@ -0,0 +1,10 @@
+#服务器端口
+server:
+  port: 8106
+
+#数据源配置
+spring:
+  datasource:
+    url: ${kd.datasource.test.url}
+    username: ${kd.datasource.test.username}
+    password: ${kd.datasource.test.password}