zhoulisky 8 months ago
parent
commit
8c6c9c3f54

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


+ 5 - 0
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/vo/XmTechnicianHoursVO.java

@@ -1,5 +1,6 @@
 package org.sky.scientific.pojo.vo;
 package org.sky.scientific.pojo.vo;
 
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.Data;
@@ -10,6 +11,10 @@ import java.util.List;
 @Data
 @Data
 public class XmTechnicianHoursVO implements Serializable {
 public class XmTechnicianHoursVO implements Serializable {
 
 
+	@Schema(hidden = true)
+	@JsonIgnore
+	private Integer xh;
+
 	@Schema(description = "所属年月")
 	@Schema(description = "所属年月")
 	private String yearAndMonth;
 	private String yearAndMonth;
 
 

+ 2 - 2
kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/XmTechnicianHoursController.java

@@ -64,10 +64,10 @@ public class XmTechnicianHoursController extends KdController {
 		return R.status(service.clear(dto));
 		return R.status(service.clear(dto));
 	}
 	}
 
 
-	@GetMapping("/export")
+	@PostMapping("/export")
 	@ApiOperationSupport(order = 12)
 	@ApiOperationSupport(order = 12)
 	@Operation(summary = "导出")
 	@Operation(summary = "导出")
-	public void export(XmTechnicianHoursVO param,  HttpServletResponse response) {
+	public void export(HttpServletResponse response, @RequestBody XmTechnicianHoursVO param) {
 		service.export(response, param);
 		service.export(response, param);
 	}
 	}
 
 

+ 7 - 6
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/AttendanceMonthlyDataListener.java

@@ -15,9 +15,9 @@ import java.util.Map;
 @Data
 @Data
 public class AttendanceMonthlyDataListener implements ReadListener<Map<Integer, String>> {
 public class AttendanceMonthlyDataListener implements ReadListener<Map<Integer, String>> {
 
 
-	private static final int HEADER_ROW_1 = 0; // 星期行(0-based)
-	private static final int HEADER_ROW_2 = 1; // 日期行
-	private static final int DATA_START_ROW = 2; // 数据开始行
+	private static final int HEADER_ROW_1 = 1; // 星期行(0-based)
+	private static final int HEADER_ROW_2 = 2; // 日期行
+	private static final int DATA_START_ROW = 3; // 数据开始行
 
 
 	private List<String> dayOfWeekHeaders = new ArrayList<>();
 	private List<String> dayOfWeekHeaders = new ArrayList<>();
 	private List<String> dateHeaders = new ArrayList<>();
 	private List<String> dateHeaders = new ArrayList<>();
@@ -87,8 +87,10 @@ public class AttendanceMonthlyDataListener implements ReadListener<Map<Integer,
 			//没有填报的日期,跳过
 			//没有填报的日期,跳过
 			if (hoursStr != null && !hoursStr.trim().isEmpty()) {
 			if (hoursStr != null && !hoursStr.trim().isEmpty()) {
 				try {
 				try {
+					String date = dateHeaders.get(i);
+					String s = Integer.parseInt(date) <= 9 ? ("0" + date) : date;
 					DailyAttendance daily = new DailyAttendance();
 					DailyAttendance daily = new DailyAttendance();
-					daily.setWorkDate(yearAndMonth + dateHeaders.get(i));
+					daily.setWorkDate(yearAndMonth + s);
 					daily.setWorkHours(safeParseDouble(hoursStr));
 					daily.setWorkHours(safeParseDouble(hoursStr));
 					record.getDailyAttendances().add(daily);
 					record.getDailyAttendances().add(daily);
 				} catch (NumberFormatException e) {
 				} catch (NumberFormatException e) {
@@ -104,8 +106,7 @@ public class AttendanceMonthlyDataListener implements ReadListener<Map<Integer,
 			record.setMonthlyHours(safeParseDouble(data.get(lastCol)));
 			record.setMonthlyHours(safeParseDouble(data.get(lastCol)));
 			record.setMonthlyDays(safeParseDouble(data.get(lastCol + 1)));
 			record.setMonthlyDays(safeParseDouble(data.get(lastCol + 1)));
 		}
 		}
-		System.out.println(record);
-		records.add(record);
+ 		records.add(record);
 	}
 	}
 
 
 	@Override
 	@Override

+ 3 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/XmGoodsExcel.java

@@ -40,6 +40,9 @@ public class XmGoodsExcel implements Serializable {
 	@JsonFormat(pattern = DateUtil.PATTERN_DATE)
 	@JsonFormat(pattern = DateUtil.PATTERN_DATE)
 	private Date useDate;
 	private Date useDate;
 
 
+	@ExcelProperty("领用日期")
+	private String useDateStr;
+
 	@ExcelProperty("研发项目名称")
 	@ExcelProperty("研发项目名称")
 	private String xmmc;
 	private String xmmc;
 
 

+ 1 - 1
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/AttendanceServiceImpl.java

@@ -107,7 +107,7 @@ public class AttendanceServiceImpl extends BaseServiceImpl<AttendanceMapper, Att
 		EasyExcel.read(new BufferedInputStream(file.getInputStream()))
 		EasyExcel.read(new BufferedInputStream(file.getInputStream()))
 			.registerReadListener(listener)
 			.registerReadListener(listener)
 			.sheet(0)
 			.sheet(0)
-			.headRowNumber(2) // 重要:设置表头行数(0-based)
+			.headRowNumber(3) // 重要:设置表头行数(0-based)
 			.doRead();
 			.doRead();
 		List<AttendanceMonthlyExcel> records = listener.getRecords();
 		List<AttendanceMonthlyExcel> records = listener.getRecords();
 		if (CollectionUtil.isEmpty(records)) {
 		if (CollectionUtil.isEmpty(records)) {

+ 5 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmGoodsServiceImpl.java

@@ -28,6 +28,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
 import java.io.InputStream;
 import java.io.InputStream;
+import java.math.BigDecimal;
 import java.net.URLEncoder;
 import java.net.URLEncoder;
 import java.util.*;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -72,7 +73,11 @@ public class XmGoodsServiceImpl extends BaseServiceImpl<XmGoodsMapper, XmGoodsEn
 			XmGoodsExcel excel = BeanUtil.copyProperties(vo, XmGoodsExcel.class);
 			XmGoodsExcel excel = BeanUtil.copyProperties(vo, XmGoodsExcel.class);
 			assert excel != null;
 			assert excel != null;
 			excel.setXh(index.getAndIncrement());
 			excel.setXh(index.getAndIncrement());
+
+			excel.setAmount(excel.getUnitPrice().multiply(new BigDecimal(excel.getUseQuantity())));
+			excel.setUseDateStr(DateUtil.format(excel.getUseDate(), DateUtil.PATTERN_DATE));
 			resultList.add(excel);
 			resultList.add(excel);
+
 		}
 		}
 
 
 		ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
 		ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())

+ 129 - 3
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmTechnicianHoursServiceImpl.java

@@ -2,6 +2,7 @@
 package org.sky.scientific.service.impl;
 package org.sky.scientific.service.impl;
 
 
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -11,12 +12,17 @@ import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.sky.core.log.exception.ServiceException;
 import org.sky.core.log.exception.ServiceException;
 import org.sky.core.mp.base.BaseServiceImpl;
 import org.sky.core.mp.base.BaseServiceImpl;
+import org.sky.core.mp.support.Condition;
+import org.sky.core.mp.support.Query;
 import org.sky.core.secure.utils.SecureUtil;
 import org.sky.core.secure.utils.SecureUtil;
+import org.sky.core.tool.utils.Charsets;
 import org.sky.core.tool.utils.CollectionUtil;
 import org.sky.core.tool.utils.CollectionUtil;
 import org.sky.core.tool.utils.Func;
 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.excel.handle.AttendanceMergeStrategy;
+import org.sky.scientific.excel.handle.CustomCellStyleHandler;
 import org.sky.scientific.mapper.*;
 import org.sky.scientific.mapper.*;
 import org.sky.scientific.pojo.dto.TechnicianDTO;
 import org.sky.scientific.pojo.dto.TechnicianDTO;
 import org.sky.scientific.pojo.entity.XmTechnicianHours;
 import org.sky.scientific.pojo.entity.XmTechnicianHours;
@@ -30,7 +36,9 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
 import java.io.BufferedInputStream;
 import java.io.BufferedInputStream;
+import java.net.URLEncoder;
 import java.util.*;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -58,7 +66,7 @@ public class XmTechnicianHoursServiceImpl extends BaseServiceImpl<XmTechnicianHo
 		EasyExcel.read(new BufferedInputStream(file.getInputStream()))
 		EasyExcel.read(new BufferedInputStream(file.getInputStream()))
 			.registerReadListener(listener)
 			.registerReadListener(listener)
 			.sheet(0)
 			.sheet(0)
-			.headRowNumber(4) // 重要:设置表头行数(0-based)
+			.headRowNumber(3) // 重要:设置表头行数(0-based)
 			.doRead();
 			.doRead();
 		List<XmTechnicianHoursExcel> records = listener.getRecords();
 		List<XmTechnicianHoursExcel> records = listener.getRecords();
 		if (CollectionUtil.isEmpty(records)) {
 		if (CollectionUtil.isEmpty(records)) {
@@ -308,10 +316,128 @@ public class XmTechnicianHoursServiceImpl extends BaseServiceImpl<XmTechnicianHo
 		return true;
 		return true;
 	}
 	}
 
 
-	//
 	@Override
 	@Override
-	public void export(HttpServletResponse response, XmTechnicianHoursVO param) {
+	public void export(HttpServletResponse response, XmTechnicianHoursVO dto) {
+		try {
+			response.setContentType("application/vnd.ms-excel");
+			response.setCharacterEncoding("utf-8");
+			response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("每月考勤信息.xls", Charsets.UTF_8));
+
+			Query query = new Query().setCurrent(1).setSize(Integer.MAX_VALUE);
+
+			List<XmTechnicianHoursVO> list = this.selectPage(dto, Condition.getPage(query)).getRecords();
+			AtomicInteger index = new AtomicInteger(1);
+			for (XmTechnicianHoursVO vo : list) {
+				vo.setXh(index.getAndIncrement());
+			}
+			Integer year = Integer.valueOf(dto.getYearAndMonth().substring(0, 4));
+			Integer month = Integer.valueOf(dto.getYearAndMonth().substring(5));
+
+			// 构建数据
+			List<List<Object>> data = buildData(list, year, month);
+
+			// 导出Excel(包含合并单元格策略)
+			EasyExcel.write(response.getOutputStream())
+				.registerWriteHandler(new AttendanceMergeStrategy(year, month))
+				.registerWriteHandler(new CustomCellStyleHandler())
+				.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
+				.autoCloseStream(true)
+				.sheet("考勤信息")
+				.doWrite(data);
+
+		} catch (Exception e) {
+			throw new ServiceException("导出失败:" + e.getLocalizedMessage());
+		}
+	}
 
 
+	/**
+	 * 构建数据行
+	 */
+	private List<List<Object>> buildData(List<XmTechnicianHoursVO> list, Integer year, Integer month) {
+		List<List<Object>> data = new ArrayList<>();
+
+//		LocalDate startDate = LocalDate.of(year, month, 1);
+//		int daysInMonth = startDate.lengthOfMonth();
+//		DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
+//		DateTimeFormatter weekFormatter = DateTimeFormatter.ofPattern("E", Locale.CHINA);
+//		DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("d");
+//
+//		// 第一行:标题行
+//		List<Object> titleRow = new ArrayList<>();
+//		titleRow.add("研发工时记录表" + year + "年" + month + "月");
+//		for (int i = 1; i < daysInMonth + 7; i++) { // 7 = 5个固定列 + 2个统计列
+//			titleRow.add("");
+//		}
+//		data.add(titleRow);
+//
+//		// 第二行:纵向表头标题
+//		List<Object> verticalHeaderRow = new ArrayList<>();
+//		verticalHeaderRow.add("序号");
+//		verticalHeaderRow.add("姓名");
+//		verticalHeaderRow.add("工号");
+//		verticalHeaderRow.add("身份证号码");
+//		verticalHeaderRow.add("科研人员类别");
+//		//第二行:周几行
+//		for (int i = 1; i <= daysInMonth; i++) {
+//			LocalDate date = LocalDate.of(year, month, i);
+//			verticalHeaderRow.add(date.format(weekFormatter).substring(1));
+//		}
+//		verticalHeaderRow.add("本月出勤/小时");
+//		verticalHeaderRow.add("本月出勤/天");
+//		data.add(verticalHeaderRow);
+//
+//		// 第三行:日期数字行
+//		List<Object> dayRow = new ArrayList<>();
+//		dayRow.add("");
+//		dayRow.add("");
+//		dayRow.add("");
+//		dayRow.add("");
+//		dayRow.add("");
+//		for (int day = 1; day <= daysInMonth; day++) {
+//			LocalDate date = LocalDate.of(year, month, day);
+//			dayRow.add(date.format(dayFormatter));
+//		}
+//		dayRow.add("");
+//		dayRow.add("");
+//		data.add(dayRow);
+//
+//		// 第4行开始:数据行
+//		for (AttendanceVO attendance : attendanceList) {
+//			List<Object> dataRow = new ArrayList<>();
+//
+//			// 序号
+//			dataRow.add(attendance.getXh());
+//			// 姓名
+//			dataRow.add(attendance.getName());
+//			// 工号
+//			dataRow.add(attendance.getNumber());
+//			// 身份证号码
+//			dataRow.add(attendance.getIdCard());
+//			// 科研人员类别
+//			dataRow.add(attendance.getPersonnelType());
+//
+//			// 每日考勤数据
+//			Map<String, Double> dailyMap = new HashMap<>();
+//			if (attendance.getDailyAttendances() != null) {
+//				for (DailyAttendance daily : attendance.getDailyAttendances()) {
+//					dailyMap.put(daily.getWorkDate(), daily.getWorkHours());
+//				}
+//			}
+//
+//			for (int day = 1; day <= daysInMonth; day++) {
+//				LocalDate currentDate = LocalDate.of(year, month, day);
+//				String dateKey = currentDate.format(dateFormatter);
+//				dataRow.add(dailyMap.getOrDefault(dateKey, 0.0));
+//			}
+//
+//			// 统计信息
+//			dataRow.add(attendance.getMonthlyHours());
+//			dataRow.add(attendance.getMonthlyDays());
+//
+//			data.add(dataRow);
+//		}
+
+		return data;
 	}
 	}
 
 
 	@Override
 	@Override

BIN
kd-service/kd-scientific/src/main/resources/export-template/每月研发工时记录表.xls


BIN
kd-service/kd-scientific/src/main/resources/export-template/研发领料燃料动力明细清单.xls


+ 3 - 1
kd-service/kd-system/src/main/java/org/sky/system/mapper/TenantMapper.java

@@ -2,6 +2,7 @@ package org.sky.system.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
 import org.sky.system.pojo.entity.Tenant;
 import org.sky.system.pojo.entity.Tenant;
 
 
 import java.util.List;
 import java.util.List;
@@ -19,6 +20,7 @@ public interface TenantMapper extends BaseMapper<Tenant> {
 	 * @param tenant
 	 * @param tenant
 	 * @return
 	 * @return
 	 */
 	 */
-	List<Tenant> selectTenantPage(IPage page, Tenant tenant);
+
+ 	List<Tenant> selectTenantPage(IPage page, @Param("ew") Tenant tenant);
 
 
 }
 }

+ 14 - 1
kd-service/kd-system/src/main/java/org/sky/system/mapper/TenantMapper.xml

@@ -21,11 +21,24 @@
         <result column="account_number" property="accountNumber"/>
         <result column="account_number" property="accountNumber"/>
         <result column="expire_time" property="expireTime"/>
         <result column="expire_time" property="expireTime"/>
         <result column="license_key" property="licenseKey"/>
         <result column="license_key" property="licenseKey"/>
+        <result column="short_name" property="shortName"/>
+        <result column="uscc" property="uscc"/>
+        <result column="province_code" property="provinceCode"/>
+        <result column="city_code" property="cityCode"/>
+        <result column="district_code" property="districtCode"/>
+        <result column="vip_years" property="vipYears"/>
+        <result column="saleman" property="saleman"/>
     </resultMap>
     </resultMap>
 
 
 
 
     <select id="selectTenantPage" resultMap="tenantResultMap">
     <select id="selectTenantPage" resultMap="tenantResultMap">
-        select * from kd_tenant where is_deleted = 0
+        select * from kd_tenant
+        <where>
+            <if test="ew.tenantId!=null and ew.tenantId!=''">and tenant_id like concat('%',#{ew.tenantId},'%')</if>
+            <if test="ew.tenantName!=null and ew.tenantName!=''">and tenant_name like concat('%',#{ew.tenantName},'%')</if>
+            <if test="ew.uscc!=null and ew.uscc!=''">and uscc like concat('%',#{ew.uscc},'%')</if>
+            <if test="ew.linkman!=null and ew.linkman!=''">and linkman like concat('%',#{ew.linkman},'%')</if>
+        </where>
     </select>
     </select>
 
 
 </mapper>
 </mapper>