Compare commits
8 Commits
46f1c9fde1
...
a56ead69ba
| Author | SHA1 | Date |
|---|---|---|
|
|
a56ead69ba | |
|
|
5cc09af89b | |
|
|
06fb749a7c | |
|
|
91ebd93f5a | |
|
|
9db67591a0 | |
|
|
5ee756a4a1 | |
|
|
ce9a9954a4 | |
|
|
ec8421a610 |
|
|
@ -1,15 +1,11 @@
|
|||
/weaver-develop.iml
|
||||
/out/
|
||||
.idea/
|
||||
|
||||
HELP.md
|
||||
target/
|
||||
|
||||
.idea
|
||||
|
||||
/target/
|
||||
/test
|
||||
/src/rebel.xml
|
||||
/src/META-INF
|
||||
/WEB-INF/config
|
||||
|
||||
/log
|
||||
/src/META-INF/
|
||||
/src/test/
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
<component name="ArtifactManager">
|
||||
<artifact type="jar" name="weaver-develop:jar">
|
||||
<output-path>$PROJECT_DIR$/out/artifacts/weaver_develop_jar</output-path>
|
||||
<root id="archive" name="weaver-develop.jar">
|
||||
<element id="module-output" name="weaver-develop" />
|
||||
</root>
|
||||
</artifact>
|
||||
</component>
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<annotationProcessing>
|
||||
<profile default="true" name="Default" enabled="true" />
|
||||
</annotationProcessing>
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
<component name="libraryTable">
|
||||
<library name="classbean">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/../../../../weaver/ecology/classbean" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
<component name="libraryTable">
|
||||
<library name="lib">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/../../../../weaver/ecology/WEB-INF/lib" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/../../../../weaver/ecology/WEB-INF/lib" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/../../../../weaver/ecology/WEB-INF/lib" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/../../../../weaver/ecology/WEB-INF/lib" recursive="false" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
Manifest-Version: 1.0
|
||||
Main-Class: test.MainTest
|
||||
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
package com.api.forstarsecond.web;
|
||||
|
||||
import javax.ws.rs.Path;
|
||||
|
||||
/**
|
||||
* @Author liang.cheng
|
||||
* @Date 2025/4/27 10:03
|
||||
* @Description:
|
||||
* @Version 1.0
|
||||
*/
|
||||
@Path("/forstar/second/cube")
|
||||
public class ExamineRankingAction extends com.engine.forstarsecond.web.ExamineRankingAction {
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
package com.engine.forstarsecond.entity;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @Author liang.cheng
|
||||
* @Date 2025/4/29 10:05
|
||||
* @Description: TODO
|
||||
* @Version 1.0
|
||||
*/
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class ExamineRanking {
|
||||
|
||||
private Integer id;
|
||||
|
||||
private double df;
|
||||
|
||||
private Integer ssks;
|
||||
|
||||
private Integer bmmc;
|
||||
|
||||
private String bmpm;
|
||||
|
||||
private String kspm;
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
package com.engine.forstarsecond.entity;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @Author liang.cheng
|
||||
* @Date 2025/5/8 09:29
|
||||
* @Description: TODO
|
||||
* @Version 1.0
|
||||
*/
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class FamilyWorkUnit {
|
||||
|
||||
private String id;
|
||||
|
||||
private String unit;
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
package com.engine.forstarsecond.service;
|
||||
|
||||
import com.engine.forstarsecond.entity.ExamineRanking;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Author liang.cheng
|
||||
* @Date 2025/4/27 10:04
|
||||
* @Description: TODO
|
||||
* @Version 1.0
|
||||
*/
|
||||
public interface ExamineRankingService {
|
||||
|
||||
/**
|
||||
* @Description: 计算排名
|
||||
* @Author: liang.cheng
|
||||
* @Date: 2025/4/29 09:54
|
||||
* @param: [params]
|
||||
* @return: java.util.Map<java.lang.String,java.lang.Object>
|
||||
*/
|
||||
int examineRanking(Map<String, Object> params);
|
||||
|
||||
|
||||
/**
|
||||
* @Description: 员工月/季绩效评价
|
||||
* @Author: liang.cheng
|
||||
* @Date: 2025/4/29 09:58
|
||||
* @param: [khqj]
|
||||
* @return: List<ExamineRanking>
|
||||
*/
|
||||
List<ExamineRanking> calculateWorkers(String khqj,String yglb);
|
||||
|
||||
|
||||
/**
|
||||
* @Description: 年度综合评价
|
||||
* @Author: liang.cheng
|
||||
* @Date: 2025/4/29 09:58
|
||||
* @param: [khqj]
|
||||
* @return: List<ExamineRanking>
|
||||
*/
|
||||
List<ExamineRanking> calculateWorkersByYear(String khqj,String yglb);
|
||||
|
||||
/**
|
||||
* @Description: 获取人员图像
|
||||
* @Author: liang.cheng
|
||||
* @Date: 2025/4/30 14:35
|
||||
* @param: [resourceId]
|
||||
* @return: java.lang.String
|
||||
*/
|
||||
Map<String,Object> resourceImage(String billid);
|
||||
|
||||
/**
|
||||
* @Description: 获取普实供应商列表
|
||||
* @Author: liang.cheng
|
||||
* @Date: 2025/5/7 15:47
|
||||
* @param: [billid]
|
||||
* @return: java.util.List<java.lang.String>
|
||||
*/
|
||||
List<String> workUnits();
|
||||
|
||||
/**
|
||||
* @Description: 家庭成员工作单位
|
||||
* @Author: liang.cheng
|
||||
* @Date: 2025/5/7 16:03
|
||||
* @param: [params]
|
||||
* @return: java.util.List<java.lang.String>
|
||||
*/
|
||||
Map<String,List<String>> familyWorkUnit(Map<String, Object> params);
|
||||
}
|
||||
|
|
@ -0,0 +1,181 @@
|
|||
package com.engine.forstarsecond.service.impl;
|
||||
|
||||
import com.engine.core.impl.Service;
|
||||
import com.engine.forstarsecond.entity.ExamineRanking;
|
||||
import com.engine.forstarsecond.entity.FamilyWorkUnit;
|
||||
import com.engine.forstarsecond.service.ExamineRankingService;
|
||||
import lombok.SneakyThrows;
|
||||
import weaver.conn.RecordSet;
|
||||
import weaver.conn.RecordSetDataSource;
|
||||
import weaver.general.Util;
|
||||
import weaver.hrm.resource.ResourceComInfo;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Author liang.cheng
|
||||
* @Date 2025/4/27 10:04
|
||||
* @Description: TODO
|
||||
* @Version 1.0
|
||||
*/
|
||||
public class ExamineRankingServiceImpl extends Service implements ExamineRankingService {
|
||||
|
||||
@Override
|
||||
public int examineRanking(Map<String, Object> params) {
|
||||
|
||||
String type = Util.null2String(params.get("type"));
|
||||
String khqj = Util.null2String(params.get("khqj"));
|
||||
String khnd = Util.null2String(params.get("khnd"));
|
||||
String yglb = Util.null2String(params.get("yglb"));
|
||||
|
||||
|
||||
List<ExamineRanking> examineRankings;
|
||||
|
||||
if ("1".equals(type)) {
|
||||
examineRankings = calculateWorkers(khqj,yglb);
|
||||
}else {
|
||||
examineRankings = calculateWorkersByYear(khnd,yglb);
|
||||
}
|
||||
return examineRankings.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ExamineRanking> calculateWorkers(String khqj,String yglb) {
|
||||
|
||||
RecordSet rs = new RecordSet();
|
||||
List<ExamineRanking> examineRankings = new ArrayList<>();
|
||||
rs.executeQuery("select id,ydzhdf,ssks,bmmc from uf_hr_ydjxkhpj_data where khqj = ? and yglb = ?",khqj,yglb);
|
||||
while (rs.next()) {
|
||||
examineRankings.add(ExamineRanking.builder()
|
||||
.id(Util.getIntValue(rs.getString("id")))
|
||||
.df(Util.getDoubleValue(rs.getString("ydzhdf")))
|
||||
.ssks(Util.getIntValue(rs.getString("ssks")))
|
||||
.bmmc(Util.getIntValue(rs.getString("bmmc")))
|
||||
.build());
|
||||
}
|
||||
// 分别处理 ssks → kspm 和 bmmc → bmpm 的排名
|
||||
calculateRank(examineRankings, ExamineRanking::getSsks, ExamineRanking::setKspm);
|
||||
calculateRank(examineRankings, ExamineRanking::getBmmc, ExamineRanking::setBmpm);
|
||||
|
||||
examineRankings.forEach(examine -> rs.executeUpdate("update uf_hr_ydjxkhpj_data set bmpm = ?,kspm = ? where id = ?",examine.getBmpm(),examine.getKspm(),examine.getId()));
|
||||
|
||||
return examineRankings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ExamineRanking> calculateWorkersByYear(String year,String yglb) {
|
||||
RecordSet rs = new RecordSet();
|
||||
List<ExamineRanking> examineRankings = new ArrayList<>();
|
||||
rs.executeQuery("select id,ndzhdf,ssks,bmmc from uf_hr_jxkhndpjb where khnd = ? and yglb = ?",year,yglb);
|
||||
while (rs.next()) {
|
||||
examineRankings.add(ExamineRanking.builder()
|
||||
.id(Util.getIntValue(rs.getString("id")))
|
||||
.df(Util.getDoubleValue(rs.getString("ndzhdf")))
|
||||
.ssks(Util.getIntValue(rs.getString("ssks")))
|
||||
.bmmc(Util.getIntValue(rs.getString("bmmc")))
|
||||
.build());
|
||||
}
|
||||
// 分别处理 ssks → kspm 和 bmmc → bmpm 的排名
|
||||
calculateRank(examineRankings, ExamineRanking::getSsks, ExamineRanking::setKspm);
|
||||
calculateRank(examineRankings, ExamineRanking::getBmmc, ExamineRanking::setBmpm);
|
||||
|
||||
examineRankings.forEach(examine -> rs.executeUpdate("update uf_hr_jxkhndpjb set bmpm = ?,kspm = ? where id = ?",examine.getBmpm(),examine.getKspm(),examine.getId()));
|
||||
|
||||
return examineRankings;
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@Override
|
||||
public Map<String,Object> resourceImage(String billid) {
|
||||
RecordSet rs = new RecordSet();
|
||||
Map<String,Object> result = new HashMap<>();
|
||||
rs.executeQuery("select ryid from uf_hr_employee where id = ?",billid);
|
||||
rs.next();
|
||||
String ryid = Util.null2String(rs.getString("ryid"));
|
||||
result.put("id",ryid);
|
||||
result.put("url",new ResourceComInfo().getMessagerUrls(ryid));
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> workUnits() {
|
||||
RecordSetDataSource rst = new weaver.conn.RecordSetDataSource();
|
||||
List<String> unitList = new ArrayList<>();
|
||||
rst.executeQueryWithDatasource("select VndName from V_OA_BPVnd","psxt");
|
||||
while (rst.next()) {
|
||||
unitList.add(Util.null2String(rst.getString("VndName").trim()));
|
||||
}
|
||||
return unitList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String,List<String>> familyWorkUnit(Map<String, Object> params) {
|
||||
RecordSet rs = new RecordSet();
|
||||
String type = Util.null2String(params.get("type"));
|
||||
//1 正式员工台账
|
||||
String tableName = "1".equals(type) ? "uf_jcl_rzgl_dt3" : "uf_jcl_wbrzgl_dt3";
|
||||
List<FamilyWorkUnit> familyWorkUnits = new ArrayList<>();
|
||||
rs.executeQuery("select mainid,gzdw from "+tableName);
|
||||
while (rs.next()) {
|
||||
familyWorkUnits.add(FamilyWorkUnit.builder()
|
||||
.id(Util.null2String(rs.getString("mainid")))
|
||||
.unit(Util.null2String(rs.getString("gzdw")))
|
||||
.build());
|
||||
}
|
||||
return familyWorkUnits.stream()
|
||||
.collect(Collectors.groupingBy(
|
||||
FamilyWorkUnit::getId,
|
||||
Collectors.mapping(
|
||||
FamilyWorkUnit::getUnit,
|
||||
Collectors.toList()
|
||||
)
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通用排名计算方法
|
||||
* @param dataList
|
||||
* @param groupKeyGetter
|
||||
* @param rankFieldSetter
|
||||
*/
|
||||
private void calculateRank(
|
||||
List<ExamineRanking> dataList,
|
||||
Function<ExamineRanking, Integer> groupKeyGetter,
|
||||
BiConsumer<ExamineRanking, String> rankFieldSetter
|
||||
) {
|
||||
// 1. 按分组字段(如 ssks 或 bmmc)分组
|
||||
Map<Integer, List<ExamineRanking>> groupedData = dataList.stream()
|
||||
.collect(Collectors.groupingBy(groupKeyGetter));
|
||||
|
||||
// 2. 处理每个分组
|
||||
groupedData.forEach((groupKey, groupList) -> {
|
||||
// 按 ydzhdf 降序排序
|
||||
groupList.sort((a, b) -> Double.compare(b.getDf(), a.getDf()));
|
||||
|
||||
int groupSize = groupList.size();
|
||||
if (groupSize == 0){
|
||||
return;
|
||||
}
|
||||
|
||||
// 动态计算排名
|
||||
double previousScore = groupList.get(0).getDf();
|
||||
int currentRank = 1;
|
||||
rankFieldSetter.accept(groupList.get(0), currentRank + "/" + groupSize);
|
||||
|
||||
for (int i = 1; i < groupSize; i++) {
|
||||
ExamineRanking current = groupList.get(i);
|
||||
if (Math.abs(current.getDf() - previousScore) > 1e-6) {
|
||||
currentRank = i + 1;
|
||||
previousScore = current.getDf();
|
||||
}
|
||||
rankFieldSetter.accept(current, currentRank + "/" + groupSize);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,101 @@
|
|||
package com.engine.forstarsecond.web;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||
import com.engine.common.util.ParamUtil;
|
||||
import com.engine.common.util.ServiceUtil;
|
||||
import com.engine.forstarsecond.service.ExamineRankingService;
|
||||
import com.engine.forstarsecond.service.impl.ExamineRankingServiceImpl;
|
||||
import weaver.hrm.HrmUserVarify;
|
||||
import weaver.hrm.User;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.ws.rs.*;
|
||||
import javax.ws.rs.core.Context;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Author liang.cheng
|
||||
* @Date 2025/4/27 10:04
|
||||
* @Description: TODO
|
||||
* @Version 1.0
|
||||
*/
|
||||
public class ExamineRankingAction {
|
||||
|
||||
private ExamineRankingService getService(User user) {
|
||||
return ServiceUtil.getService(ExamineRankingServiceImpl.class, user);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("/examineRanking")
|
||||
@Produces(MediaType.TEXT_PLAIN)
|
||||
public String examineRanking(@Context HttpServletRequest request, @Context HttpServletResponse response) {
|
||||
Map<String, Object> data = new HashMap<>(8);
|
||||
try {
|
||||
User user = HrmUserVarify.getUser(request, response);
|
||||
data.put("size", getService(user).examineRanking(ParamUtil.request2Map(request)));
|
||||
data.put("code", 200);
|
||||
} catch (Exception e) {
|
||||
data.put("code", 500);
|
||||
data.put("msg", "catch exception : " + e.getMessage());
|
||||
}
|
||||
return JSONObject.toJSONString(data, SerializerFeature.DisableCircularReferenceDetect);
|
||||
}
|
||||
|
||||
@GET
|
||||
@Path("/resourceImage")
|
||||
@Produces(MediaType.TEXT_PLAIN)
|
||||
public String resourceImage(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam("billid") String billid) {
|
||||
Map<String, Object> data = new HashMap<>(8);
|
||||
try {
|
||||
User user = HrmUserVarify.getUser(request, response);
|
||||
data.putAll(getService(user).resourceImage(billid));
|
||||
data.put("code", 200);
|
||||
} catch (Exception e) {
|
||||
data.put("code", 500);
|
||||
data.put("msg", "catch exception : " + e.getMessage());
|
||||
}
|
||||
return JSONObject.toJSONString(data, SerializerFeature.DisableCircularReferenceDetect);
|
||||
}
|
||||
|
||||
@GET
|
||||
@Path("/workUnits")
|
||||
@Produces(MediaType.TEXT_PLAIN)
|
||||
public String workUnits(@Context HttpServletRequest request, @Context HttpServletResponse response) {
|
||||
Map<String, Object> data = new HashMap<>(8);
|
||||
try {
|
||||
User user = HrmUserVarify.getUser(request, response);
|
||||
data.put("units",getService(user).workUnits());
|
||||
data.put("code", 200);
|
||||
} catch (Exception e) {
|
||||
data.put("code", 500);
|
||||
data.put("msg", "catch exception : " + e.getMessage());
|
||||
}
|
||||
return JSONObject.toJSONString(data, SerializerFeature.DisableCircularReferenceDetect);
|
||||
}
|
||||
|
||||
@GET
|
||||
@Path("/familyWorkUnit")
|
||||
@Produces(MediaType.TEXT_PLAIN)
|
||||
public String familyWorkUnit(@Context HttpServletRequest request, @Context HttpServletResponse response) {
|
||||
Map<String, Object> data = new HashMap<>(8);
|
||||
try {
|
||||
User user = HrmUserVarify.getUser(request, response);
|
||||
data.put("unitList", getService(user).familyWorkUnit(ParamUtil.request2Map(request)));
|
||||
data.put("code", 200);
|
||||
} catch (Exception e) {
|
||||
data.put("code", 500);
|
||||
data.put("msg", "catch exception : " + e.getMessage());
|
||||
}
|
||||
return JSONObject.toJSONString(data,SerializerFeature.DisableCircularReferenceDetect);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
package com.weaver.formmode.customjavacode.forstarsecond;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import weaver.conn.RecordSetDataSource;
|
||||
import weaver.formmode.customjavacode.AbstractCustomSqlConditionJavaCode;
|
||||
import weaver.general.Util;
|
||||
|
||||
|
||||
public class CustomSearchTemplate extends AbstractCustomSqlConditionJavaCode {
|
||||
|
||||
/**
|
||||
* 生成SQL查询限制条件
|
||||
* @param param
|
||||
* param包含(但不限于)以下数据
|
||||
* user 当前用户
|
||||
*
|
||||
* @return
|
||||
* 返回的查询限制条件的格式举例为: t1.a = '1' and t1.b = '3' and t1.c like '%22%'
|
||||
* 其中t1为表单主表表名的别名
|
||||
*/
|
||||
@Override
|
||||
public String generateSqlCondition(Map<String, Object> param) throws Exception {
|
||||
|
||||
RecordSetDataSource rst = new RecordSetDataSource();
|
||||
List<String> unitList = new ArrayList<>();
|
||||
rst.executeQueryWithDatasource("select VndName from V_OA_BPVnd","psxt");
|
||||
while (rst.next()) {
|
||||
unitList.add(Util.null2String(rst.getString("VndName").trim()));
|
||||
}
|
||||
int batchSize = 900;
|
||||
List<List<String>> batches = new ArrayList<>();
|
||||
for (int i = 0; i < unitList.size(); i += batchSize) {
|
||||
batches.add(unitList.subList(i, Math.min(i + batchSize, unitList.size())));
|
||||
}
|
||||
|
||||
// 为每批生成 IN 条件
|
||||
List<String> inConditions = batches.stream()
|
||||
.map(batch -> batch.stream()
|
||||
.distinct()
|
||||
.map(s -> "'" + s + "'")
|
||||
.collect(Collectors.joining(",")))
|
||||
.map(batch -> "d1.gzdw IN (" + batch + ")")
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 用 OR 连接多个 IN 条件
|
||||
String sqlCondition = "(" + String.join(" OR ", inConditions) + ")";
|
||||
|
||||
return sqlCondition;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
package test;
|
||||
|
||||
/**
|
||||
* @Author weaver_cl
|
||||
* @Description:
|
||||
* @Date 2022/10/9
|
||||
* @Version V1.0
|
||||
**/
|
||||
public class MainTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue