同步hr系统出勤记录信息

master
FCD 6 days ago
parent 9115dc753f
commit dc0fa3c606

@ -5,8 +5,10 @@ import javax.servlet.http.HttpServletResponse;
import com.op.common.core.utils.poi.ExcelUtil;
import com.op.common.core.web.controller.BaseController;
import com.op.common.core.web.domain.AjaxResult;
import com.op.common.core.web.page.TableDataInfo;
import com.op.common.security.annotation.RequiresPermissions;
import com.op.mes.domain.MesPostAttendanceRecords;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@ -96,4 +98,38 @@ public class MesAttendanceRecordsController extends BaseController
// {
// return toAjax(mesAttendanceRecordsService.deleteMesAttendanceRecordsByIds(ids));
// }
/**
* hr
* **/
@PostMapping("/syncHrAttendance")
public AjaxResult syncHrAttendance() {
return mesAttendanceRecordsService.syncHrAttendance();
}
/**
*
* **/
@RequiresPermissions("mes:AttendanceRecords:list")
@GetMapping("/postAttendance/list")
public TableDataInfo getPostAttendanceList(MesPostAttendanceRecords mesAttendanceRecords)
{
startPage();
List<MesPostAttendanceRecords> list = mesAttendanceRecordsService.getPostAttendanceList(mesAttendanceRecords);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("mes:AttendanceRecords:export")
@PostMapping("/postAttendance/export")
public void exportPostAttendance(HttpServletResponse response, MesPostAttendanceRecords mesAttendanceRecords)
{
List<MesPostAttendanceRecords> list = mesAttendanceRecordsService.getPostAttendanceList(mesAttendanceRecords);
ExcelUtil<MesPostAttendanceRecords> util = new ExcelUtil<MesPostAttendanceRecords>(MesPostAttendanceRecords.class);
util.exportExcel(response, list, "岗位出勤数据");
}
}

@ -0,0 +1,98 @@
package com.op.mes.domain;
import com.op.common.core.annotation.Excel;
/**
* remark
*
* @author 019117
* @date
*/
public class MesPostAttendanceRecords {
@Excel(name = "排序")
private String sort;
@Excel(name = "岗位")
private String post;
@Excel(name = "总人数")
private String allNum;
@Excel(name = "出勤人数")
private String attendNum;
@Excel(name = "缺勤人数")
private String diffNum;
private String beginDate;
private String endDate;
private String deptId;
public String getSort() {
return sort;
}
public void setSort(String sort) {
this.sort = sort;
}
public String getPost() {
return post;
}
public void setPost(String post) {
this.post = post;
}
public String getAllNum() {
return allNum;
}
public void setAllNum(String allNum) {
this.allNum = allNum;
}
public String getAttendNum() {
return attendNum;
}
public void setAttendNum(String attendNum) {
this.attendNum = attendNum;
}
public String getDiffNum() {
return diffNum;
}
public void setDiffNum(String diffNum) {
this.diffNum = diffNum;
}
public String getBeginDate() {
return beginDate;
}
public void setBeginDate(String beginDate) {
this.beginDate = beginDate;
}
public String getEndDate() {
return endDate;
}
public void setEndDate(String endDate) {
this.endDate = endDate;
}
public String getDeptId() {
return deptId;
}
public void setDeptId(String deptId) {
this.deptId = deptId;
}
}

@ -2,6 +2,7 @@ package com.op.mes.mapper;
import java.util.List;
import com.op.mes.domain.MesAttendanceRecords;
import com.op.mes.domain.MesPostAttendanceRecords;
/**
* MESMapper
@ -61,4 +62,11 @@ public interface MesAttendanceRecordsMapper
List<MesAttendanceRecords> selectMesClockRecord(MesAttendanceRecords mesAttendanceRecords);
List<MesAttendanceRecords> selectMesPersonList(String deptId);
int batchAttendanceRecords(List<MesAttendanceRecords> list);
List<MesPostAttendanceRecords> getPostAttendanceList(MesPostAttendanceRecords params);
}

@ -1,7 +1,9 @@
package com.op.mes.service;
import java.util.List;
import com.op.common.core.web.domain.AjaxResult;
import com.op.mes.domain.MesAttendanceRecords;
import com.op.mes.domain.MesPostAttendanceRecords;
/**
* MESService
@ -58,4 +60,11 @@ public interface IMesAttendanceRecordsService
* @return
*/
public int deleteMesAttendanceRecordsById(String id);
AjaxResult syncHrAttendance();
List<MesPostAttendanceRecords> getPostAttendanceList(MesPostAttendanceRecords params);
}

@ -1,15 +1,32 @@
package com.op.mes.service.impl;
import java.util.ArrayList;
import java.util.List;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.op.common.core.domain.R;
import com.op.common.core.utils.DateUtils;
import com.op.common.core.utils.uuid.IdUtils;
import com.op.common.core.web.domain.AjaxResult;
import com.op.mes.domain.MesPostAttendanceRecords;
import com.op.system.api.RemoteOpenService;
import com.op.system.api.RemoteUserService;
import com.op.system.api.domain.SysUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.op.mes.mapper.MesAttendanceRecordsMapper;
import com.op.mes.domain.MesAttendanceRecords;
import com.op.mes.service.IMesAttendanceRecordsService;
import org.springframework.util.CollectionUtils;
import static com.op.common.core.web.domain.AjaxResult.error;
import static com.op.common.core.web.domain.AjaxResult.success;
/**
* MESService
@ -23,6 +40,14 @@ public class MesAttendanceRecordsServiceImpl implements IMesAttendanceRecordsSer
@Autowired
private MesAttendanceRecordsMapper mesAttendanceRecordsMapper;
@Autowired
private RemoteOpenService remoteOpenService;
@Autowired
private RemoteUserService remoteUserService;
/**
* MES
*
@ -96,4 +121,119 @@ public class MesAttendanceRecordsServiceImpl implements IMesAttendanceRecordsSer
{
return mesAttendanceRecordsMapper.deleteMesAttendanceRecordsById(id);
}
@Override
public AjaxResult syncHrAttendance() {
// 加载sf-cloud库的sys_datasource
SysUser sysUser = new SysUser();
sysUser.setUserId(1L);
DynamicDataSourceContextHolder.push("master");
R<List<Map<String, String>>> dateSources0 = new R<>();
try {
dateSources0 = remoteUserService.getPoolNameList(sysUser);
}finally {
DynamicDataSourceContextHolder.poll();
}
List<Map<String, String>> dateSources = dateSources0.getData();
ExecutorService executorService = new ThreadPoolExecutor(
dateSources.size(),
dateSources.size(),
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
try {
dateSources.forEach(dateSource -> {
if("ds_1000".equals(dateSource.get("poolName"))){
Runnable run = () -> {
DynamicDataSourceContextHolder.push(dateSource.get("poolName"));
//不同工厂使用不同的deptId
String deptId = "10000152";
//查询当前生效的车间人员信息
List<MesAttendanceRecords> personList = mesAttendanceRecordsMapper.selectMesPersonList(deptId);
//查询当天人员打开记录
Map<String,String> paramMap = new HashMap<>();
paramMap.put("bd", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,DateUtils.getNowDate()));
paramMap.put("ed", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,DateUtils.getNowDate()));
AjaxResult result = remoteOpenService.getAttRecord(paramMap);
List<MesAttendanceRecords> attendanceRecords = new ArrayList<>();
if (result.isSuccess()){
List<Map<String,String>> attList = (List<Map<String, String>>) result.get("data");
//循环遍历出车间人员打开记录
for (Map<String,String> map : attList){
for (MesAttendanceRecords person : personList)
if (person.getUserId().equals(map.get("empcode"))){
MesAttendanceRecords attendanceRecord = new MesAttendanceRecords();
attendanceRecord.setId(IdUtils.fastSimpleUUID());
attendanceRecord.setUserId(person.getUserId());
attendanceRecord.setUserName(person.getUserName());
attendanceRecord.setAttendanceStatus("正常");
attendanceRecord.setSex(person.getSex());
Date attendTime = extractAttendTime(map.get("strdata"));
attendanceRecord.setStartTime(attendTime);
attendanceRecord.setAttendanceTime("07:30-19:30");
attendanceRecord.setAttendanceDate(attendTime);
attendanceRecord.setWorkHours(0L);
attendanceRecord.setCreateTime(new Date());
attendanceRecord.setPost(person.getPost());
attendanceRecords.add(attendanceRecord);
}
}
//插入人员打卡记录
if (!CollectionUtils.isEmpty(attendanceRecords)){
mesAttendanceRecordsMapper.batchAttendanceRecords(attendanceRecords);
}
}
};
executorService.execute(run);
}
});
} catch (Exception e) {
return error("service == createCPBatchTask == exception");
} finally {
executorService.shutdown();
}
return success();
}
@Override
@DS("#header.poolName")
public List<MesPostAttendanceRecords> getPostAttendanceList(MesPostAttendanceRecords params) {
//目前只有小榄工厂黑蚊香车间
params.setDeptId("10000152");
return mesAttendanceRecordsMapper.getPostAttendanceList(params);
}
private static Date extractAttendTime(String data) {
// 校验输入是否为空
if (data == null || data.trim().isEmpty()) {
System.out.println("输入字符串不能为空");
return null;
}
// 按照空格分割字符串
String[] parts = data.split(" ");
// 校验分割后的数组长度是否符合预期
if (parts.length < 6) {
System.out.println("输入字符串格式不正确,无法提取时间");
return null;
}
// 拼接日期和时间部分
String datetimeStr = parts[4] + " " + parts[5];
// 定义日期格式并进行转换
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d HH:mm:ss");
try {
return sdf.parse(datetimeStr);
} catch (ParseException e) {
System.out.println("时间格式解析错误: " + e.getMessage());
return null;
}
}
}

@ -169,4 +169,111 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id}
</foreach>
</delete>
<select id="selectMesPersonList" resultType="com.op.mes.domain.MesAttendanceRecords" parameterType="java.lang.String">
SELECT
user_name userId,
nick_name userName,
sex,
b.post_name post
FROM
lanju_op_cloud.dbo.sys_user a
LEFT JOIN lanju_op_cloud.dbo.sys_post b ON a.post = b.post_id
WHERE
a.dept_id = #{deptId}
AND a.status = '0'
</select>
<insert id="batchAttendanceRecords">
INSERT INTO mes_attendance_records (
id,
user_id,
user_name,
attendance_status,
sex,
start_time,
attendance_time,
attendance_date,
work_hours,
create_time,
post
)
SELECT
temp.id,
temp.userId,
temp.userName,
temp.attendanceStatus,
temp.sex,
temp.startTime,
temp.attendanceTime,
temp.attendanceDate,
temp.workHours,
temp.createTime,
temp.post
FROM (
<foreach collection="list" item="item" separator="UNION ALL">
SELECT
#{item.id, jdbcType=VARCHAR} AS id,
#{item.userId, jdbcType=VARCHAR} AS userId,
#{item.userName, jdbcType=VARCHAR} AS userName,
#{item.attendanceStatus, jdbcType=VARCHAR} AS attendanceStatus,
#{item.sex, jdbcType=VARCHAR} AS sex,
#{item.startTime, jdbcType=TIMESTAMP} AS startTime,
#{item.attendanceTime, jdbcType=VARCHAR} AS attendanceTime,
#{item.attendanceDate, jdbcType=TIMESTAMP} AS attendanceDate,
#{item.workHours, jdbcType=DECIMAL} AS workHours,
#{item.createTime, jdbcType=TIMESTAMP} AS createTime,
#{item.post, jdbcType=VARCHAR} AS post
</foreach>
) AS temp
WHERE NOT EXISTS (
SELECT 1
FROM mes_attendance_records target
WHERE target.user_id = temp.userId
AND target.start_time = temp.startTime
)
</insert>
<select id="getPostAttendanceList" resultType="com.op.mes.domain.MesPostAttendanceRecords" parameterType="com.op.mes.domain.MesPostAttendanceRecords">
SELECT
ROW_NUMBER() OVER (ORDER BY a.post) AS sort,
a.post,
a.allNum,
COALESCE(d.attendNum, 0) AS attendNum,
(a.allNum - COALESCE(d.attendNum, 0)) AS diffNum
FROM (
SELECT
b.post_name AS post,
COUNT(DISTINCT a.user_id) AS allNum
FROM
lanju_op_cloud.dbo.sys_user a
LEFT JOIN lanju_op_cloud.dbo.sys_post b ON a.post = b.post_id
WHERE
a.dept_id = #{deptId}
AND a.status = '0'
GROUP BY
b.post_name
) a
LEFT JOIN (
SELECT
c.post,
COUNT(DISTINCT c.user_id) AS attendNum
FROM
dbo.mes_attendance_records c
WHERE
CONVERT(VARCHAR(10), c.attendance_date, 23) >= #{beginDate}
AND #{endDate} >= CONVERT(VARCHAR(10), c.attendance_date, 23)
GROUP BY
c.post
) d ON a.post = d.post
<where>
<if test="post != null and post != ''">
a.post LIKE CONCAT('%',#{post},'%')
</if>
</where>
</select>
</mapper>

@ -203,7 +203,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
sf1.factory_name carName,
sf.equipment_code machineCode,
sf.equipment_name machineName,
mrw.workorder_code workorderCode,
RIGHT(wo.workorder_code_sap, 9) workorderCode,
mrw.batch batch,
mrw.product_code productCode,
mrw.product_name productName,
@ -215,6 +215,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
left join base_equipment sf on sf.equipment_code = mrw.machine_code <!---线体-->
left join sys_factory sf1 on sf.workshop_code = sf1.factory_code <!--车间-->
left join sys_factory sf2 on sf1.parent_id = sf2.factory_id <!--工厂-->
LEFT JOIN pro_order_workorder wo ON wo.workorder_code = mrw.workorder_code
where mrw.parent_order = '0' and mrw.del_flag = '0'
<if test="machineName != null and machineName != ''">and sf.equipment_name like concat('%', #{machineName}, '%')</if>
<if test="carName != null and carName != ''">and sf1.factory_name like concat('%', #{carName}, '%')</if>

Loading…
Cancel
Save