|
@@ -12,6 +12,7 @@ import com.malk.service.dingtalk.DDClient_Contacts;
|
|
|
import com.malk.service.dingtalk.DDClient_Personnel;
|
|
|
import com.malk.utils.UtilFile;
|
|
|
import com.malk.utils.UtilMap;
|
|
|
+import lombok.Synchronized;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -116,6 +117,8 @@ public class LMImplService implements LMService {
|
|
|
@Override
|
|
|
public void syncDepartment() {
|
|
|
|
|
|
+ List<Map> budgetList = new ArrayList<>();
|
|
|
+
|
|
|
// 部门已同步数据
|
|
|
List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
|
|
|
.formUuid("FORM-B6F662B18C3F4D7D855CFE50243394AFQPOH")
|
|
@@ -123,89 +126,143 @@ public class LMImplService implements LMService {
|
|
|
// 匹配钉钉通讯录
|
|
|
List<Long> deptList = ddClient_contacts.getDepartmentId_all(ddClient.getAccessToken(), true, DDConf.TOP_DEPARTMENT);
|
|
|
for (long deptId : deptList) {
|
|
|
+ // 人员为空也同步 [累计到父部门]
|
|
|
List<String> userIds = ddClient_contacts.listDepartmentUserId(ddClient.getAccessToken(), deptId);
|
|
|
- if (userIds.size() == 0) {
|
|
|
- continue;
|
|
|
- }
|
|
|
Map info = ddClient_contacts.getDepartmentInfo(ddClient.getAccessToken(), deptId);
|
|
|
Map formData = UtilMap.map("textField_lpcff8zu, numberField_lr70cqsl, numberField_lr70cqsk", info.get("name"), info.get("parent_id"), info.get("dept_id"));
|
|
|
- // todo 部门ID写入需要是string集合\数组, 封装
|
|
|
- formData.putAll(UtilMap.map("employeeField_lpmbmyaa, departmentSelectField_lpaks312", info.get("dept_manager_userid_list"), Arrays.asList(String.valueOf(info.get("dept_id")))));// float budget = userIds.size() * 200; // 部门人均
|
|
|
+ formData.putAll(UtilMap.map("employeeField_lpmbmyaa, departmentSelectField_lpaks312", info.get("dept_manager_userid_list"), Arrays.asList(String.valueOf(info.get("dept_id")))));
|
|
|
float budget = userIds.size() * BUDGET_PER; // 部门人均
|
|
|
- formData.putAll(UtilMap.map("numberField_lr71bkuj, employeeField_lr71bkui, numberField_lr71mvbk", userIds.size(), userIds, budget));
|
|
|
- // Upsert操作, 记录当月预算
|
|
|
+ formData.putAll(UtilMap.map("numberField_lr71bkuj, employeeField_lr71bkui, numberField_lr71mvbk, numberField_lr7yq38c", userIds.size(), userIds, budget, 0));
|
|
|
+ // 仅记录当月预算 [记录预算金额]
|
|
|
Optional optional = dataList.stream().filter(item -> deptId == UtilMap.getLong(item, "numberField_lr70cqsk")).findAny();
|
|
|
if (optional.isPresent()) {
|
|
|
- formData.put("employeeField_lr71bkui", UtilMap.getString((Map) optional.get(), "employeeField_lr71bkui_id")); // 非常规组件数据处理
|
|
|
- ydClient.operateData(YDParam.builder()
|
|
|
- .formInstanceId(UtilMap.getString((Map) optional.get(), "instanceId"))
|
|
|
- .updateFormDataJson(JSON.toJSONString(formData))
|
|
|
- .build(), YDConf.FORM_OPERATION.update);
|
|
|
- continue;
|
|
|
+ formData.put("instanceId", UtilMap.getString((Map) optional.get(), "instanceId"));
|
|
|
+ formData.put("radioField_lpaks316", UtilMap.getString((Map) optional.get(), "radioField_lpaks316")); // 记录值
|
|
|
+ } else {
|
|
|
+ formData.putAll(UtilMap.map("numberField_lpaks318, numberField_lpayajrp, numberField_lpayajrn", 0, 0, 0));
|
|
|
+ formData.putAll(UtilMap.map("radioField_lpaks316", "是")); // 默认值
|
|
|
}
|
|
|
- formData.putAll(UtilMap.map("numberField_lpaks318, numberField_lpayajrp, numberField_lpayajrn", 0, 0, 0));
|
|
|
- formData.putAll(UtilMap.map("radioField_lpaks316", "是")); // test
|
|
|
- ydClient.operateData(YDParam.builder()
|
|
|
+ //formData.putAll(UtilMap.map("numberField_lpaks318, numberField_lpayajrp, numberField_lpayajrn", 0, 0, 0));
|
|
|
+ budgetList.add(formData);
|
|
|
+ }
|
|
|
+
|
|
|
+ // prd 不存在一人多部门情况, 若是涉及行政归属则手动维护
|
|
|
+ List<Map> manualList = ydService.queryFormData_all(YDParam.builder()
|
|
|
+ .formUuid("FORM-A192B0134C184B1A84A791F322AA4D60N4F2")
|
|
|
+ .build());
|
|
|
+ for (Map data : manualList) {
|
|
|
+ try {
|
|
|
+ String userId = String.valueOf(UtilMap.getList(data, "employeeField_lroz3y2w_id").get(0));
|
|
|
+ Map srcDpet = budgetList.stream().filter(item -> UtilMap.getList(item, "employeeField_lr71bkui").contains(userId)).findAny().get();
|
|
|
+ updateBalance(srcDpet, -BUDGET_PER, -1); // 去除原部门个人金额
|
|
|
+
|
|
|
+ boolean multi = StringUtils.isNotBlank(UtilMap.getString(data, "numberField_lroz3y37"));
|
|
|
+ if (multi) {
|
|
|
+ Map curDpet = budgetList.stream().filter(item -> data.get("numberField_lroz3y37").equals(item.get("numberField_lr70cqsk"))).findAny().get();
|
|
|
+ updateBalance(curDpet, BUDGET_PER / 2, 0.5f); // 累加部门2个人金额一半
|
|
|
+ }
|
|
|
+ Map curDpet = budgetList.stream().filter(item -> data.get("numberField_lr70cqsk").equals(item.get("numberField_lr70cqsk"))).findAny().get();
|
|
|
+ updateBalance(curDpet, multi ? BUDGET_PER / 2 : BUDGET_PER, multi ? 0.5f : 1f); // 累加部门1个人金额
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error(e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // prd 累计子节点
|
|
|
+ for (Map formData : budgetList) {
|
|
|
+ accBudget(formData, budgetList);
|
|
|
+ }
|
|
|
+ // prd 大区拆分一半
|
|
|
+ List<Map> halfList = ydService.queryFormData_all(YDParam.builder()
|
|
|
+ .formUuid("FORM-1393DC7A16424FC1BC84146C88586F91Q012")
|
|
|
+ .build());
|
|
|
+ for (Map dept : halfList) {
|
|
|
+ try {
|
|
|
+ // 顶部公司
|
|
|
+ Long deptId = UtilMap.getLong(dept, "numberField_lr70cqsk");
|
|
|
+ Map pData = budgetList.stream().filter(item -> deptId == UtilMap.getLong(item, "numberField_lr70cqsk")).findAny().get();
|
|
|
+ // 下属公司
|
|
|
+ List<Long> subList = ddClient_contacts.getDepartmentId_all(ddClient.getAccessToken(), false, deptId);
|
|
|
+ for (Long dId : subList) {
|
|
|
+ Map dData = budgetList.stream().filter(item -> dId == UtilMap.getLong(item, "numberField_lr70cqsk")).findAny().get();
|
|
|
+ float budget = UtilMap.getFloat(dData, "numberField_lr71mvbk");
|
|
|
+ if (budget <= 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ budget = budget / 2;
|
|
|
+ float quota = UtilMap.getFloat(dData, "numberField_lr71bkuj") / 2;
|
|
|
+ updateBalance(dData, -budget, -quota); // 删除原余额一半
|
|
|
+ updateBalance(pData, budget, quota); // 累计新余额一半
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error(e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Upsert操作, 记录当月预算
|
|
|
+ for (Map formData : budgetList) {
|
|
|
+ String formInstanceId = UtilMap.getString(formData, "instanceId");
|
|
|
+ YDParam ydParam = YDParam.builder()
|
|
|
.formUuid("FORM-B6F662B18C3F4D7D855CFE50243394AFQPOH")
|
|
|
.formDataJson(JSON.toJSONString(formData))
|
|
|
- .build(), YDConf.FORM_OPERATION.create);
|
|
|
+ .updateFormDataJson(JSON.toJSONString(formData))
|
|
|
+ .build();
|
|
|
+ YDConf.FORM_OPERATION operation = YDConf.FORM_OPERATION.create;
|
|
|
+ if (StringUtils.isNotBlank(formInstanceId)) {
|
|
|
+ ydParam.setFormInstanceId(formInstanceId);
|
|
|
+ operation = YDConf.FORM_OPERATION.update;
|
|
|
+ }
|
|
|
+ ydClient.operateData(ydParam, operation);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 非子阶段归属到上一层部门
|
|
|
+ private void accBudget(Map formData, List<Map> dataList) {
|
|
|
+ if ("否".equals(formData.get("radioField_lpaks316"))) {
|
|
|
+ try {
|
|
|
+ Map pData = dataList.stream().filter(item -> formData.get("numberField_lr70cqsl").equals(item.get("numberField_lr70cqsk"))).findAny().get();
|
|
|
+ float budget = UtilMap.getFloat(formData, "numberField_lr71mvbk");
|
|
|
+ float quota = UtilMap.getFloat(formData, "numberField_lr71bkuj");
|
|
|
+ updateBalance(formData, -budget, -quota); // 删除原余额
|
|
|
+ updateBalance(pData, budget, quota); // 累计新余额
|
|
|
+ accBudget(pData, dataList); // 是递归出口
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error(e.getMessage(), e);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// 涉及行政归属, 拆分规则
|
|
|
- private void updateBalance(Map item, int budget, float quota) {
|
|
|
- item.put("numberField_lpaks318", UtilMap.getFloat(item, "numberField_lpaks318") + budget); // 总经费
|
|
|
- item.put("numberField_lpayajrn", UtilMap.getFloat(item, "numberField_lpayajrn") + budget); // 可用余额
|
|
|
- item.put("numberField_lr7yq38c", UtilMap.getFloat(item, "numberField_lr7yq38c") + budget); // 修改前总金额
|
|
|
+ private void updateBalance(Map item, float budget, float quota) {
|
|
|
+ item.put("numberField_lr7yq38c", UtilMap.getFloat(item, "numberField_lr7yq38c") + budget); // 调差金额
|
|
|
item.put("numberField_lr71mvbk", UtilMap.getFloat(item, "numberField_lr71mvbk") + budget); // 当月预计预算
|
|
|
- item.put("numberField_lr71bkuj", UtilMap.getInt(item, "numberField_lr71bkuj") + quota); // 部门人数
|
|
|
+ item.put("numberField_lr71bkuj", UtilMap.getFloat(item, "numberField_lr71bkuj") + quota); // 部门人数
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 部门预算统计
|
|
|
*/
|
|
|
@Override
|
|
|
+ @Synchronized
|
|
|
public void calcBudget() {
|
|
|
|
|
|
// 部门已同步数据
|
|
|
List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
|
|
|
.formUuid("FORM-B6F662B18C3F4D7D855CFE50243394AFQPOH")
|
|
|
.build());
|
|
|
- // prd 不存在一人多部门情况, 若是涉及行政归属则手动维护
|
|
|
- List<Map> manualList = ydService.queryFormData_all(YDParam.builder()
|
|
|
- .formUuid("FORM-A192B0134C184B1A84A791F322AA4D60N4F2")
|
|
|
- .build());
|
|
|
- for (Map data : manualList) {
|
|
|
- String userId = String.valueOf(UtilMap.getList(data, "employeeField_lroz3y2w_id").get(0));
|
|
|
- Map srcDpet = dataList.stream().filter(item -> UtilMap.getList(data, "employeeField_lr71bkui_id").contains(userId)).findAny().get();
|
|
|
- updateBalance(srcDpet, -BUDGET_PER, -1); // 去除原部门个人金额
|
|
|
-
|
|
|
- boolean multi = StringUtils.isNotBlank(UtilMap.getString(data, "numberField_lroz3y37"));
|
|
|
- if (multi) {
|
|
|
- Map curDpet = dataList.stream().filter(item -> UtilMap.getList(data, "numberField_lroz3y37").contains(item.get("numberField_lr70cqsk"))).findAny().get();
|
|
|
- updateBalance(curDpet, BUDGET_PER / 2, 0.5f); // 累加部门2个人金额一半
|
|
|
- }
|
|
|
- Map curDpet = dataList.stream().filter(item -> UtilMap.getList(data, "numberField_lr70cqsk").contains(item.get("numberField_lr70cqsk"))).findAny().get();
|
|
|
- updateBalance(curDpet, multi ? BUDGET_PER / 2 : BUDGET_PER, multi ? 0.5f : 1f); // 累加部门1个人金额
|
|
|
- }
|
|
|
-
|
|
|
- // prd todo 非独立预算部门, 累计到父部门, 若父部门为空, 持续往上累加
|
|
|
dataList.forEach(item -> {
|
|
|
- if ("是".equals(item.get("radioField_lpaks316"))) {
|
|
|
- int budget = UtilMap.getInt(item, "numberField_lr71mvbk");
|
|
|
- // 冗余修改记录, 保留修改前金额并重置budget, 避免重复调用
|
|
|
- item.putAll(UtilMap.map("numberField_lr7yq38c, numberField_lr71mvbk", UtilMap.getFloat(item, "numberField_lpaks318"), 0));
|
|
|
- item.put("numberField_lpaks318", UtilMap.getFloat(item, "numberField_lpaks318") + budget);
|
|
|
- item.put("numberField_lpayajrn", UtilMap.getFloat(item, "numberField_lpayajrn") + budget);
|
|
|
- item.putAll(UtilMap.map("employeeField_lr71bkui, departmentSelectField_lpaks312", item.get("employeeField_lr71bkui_id"), item.get("departmentSelectField_lpaks312_id"))); // 非常规组件数据处理
|
|
|
-// ydClient.operateData(YDParam.builder()
|
|
|
-// .formInstanceId(UtilMap.getString(item, "instanceId"))
|
|
|
-// .updateFormDataJson(JSON.toJSONString(item))
|
|
|
-// .build(), YDConf.FORM_OPERATION.update);
|
|
|
- }
|
|
|
+ int budget = UtilMap.getInt(item, "numberField_lr71mvbk");
|
|
|
+ // 清空当月余额, 避免重复调用
|
|
|
+ item.put("numberField_lr71mvbk", 0);
|
|
|
+ item.put("numberField_lpaks318", UtilMap.getFloat(item, "numberField_lpaks318") + budget);
|
|
|
+ item.put("numberField_lpayajrn", UtilMap.getFloat(item, "numberField_lpayajrn") + budget);
|
|
|
+ // 非常规组件数据处理
|
|
|
+ item.putAll(UtilMap.map("employeeField_lr71bkui, departmentSelectField_lpaks312", item.get("employeeField_lr71bkui_id"), item.get("departmentSelectField_lpaks312_id")));
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
+ .formInstanceId(UtilMap.getString(item, "instanceId"))
|
|
|
+ .updateFormDataJson(JSON.toJSONString(item))
|
|
|
+ .build(), YDConf.FORM_OPERATION.update);
|
|
|
});
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
|
|
|
/// test
|