package com.ruoyi.productionPlan.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.framework.config.AliDingConfig;
import com.ruoyi.productionPlan.dto.ProductionPlanDto;
import com.ruoyi.productionPlan.mapper.ProductionPlanMapper;
import com.ruoyi.productionPlan.pojo.ProductionPlan;
import com.ruoyi.productionPlan.service.ProductionPlanService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.List;
/**
*
* 销售生产需求接口实现类
*
*
* @author deslrey
* @version 1.0
* @since 2026/03/10 10:00
*/
@Slf4j
@Service
public class ProductionPlanServiceImpl extends ServiceImpl implements ProductionPlanService {
@Autowired
private AliDingConfig aliDingConfig;
@Autowired
private ProductionPlanMapper productionPlanMapper;
@Override
public IPage listPage(Page page, ProductionPlanDto productionPlanDto) {
return productionPlanMapper.listPage(page, productionPlanDto);
}
/**
* 页面手动同步
*/
@Override
public void loadProdData() {
syncProdData(1);
}
/**
* 定时任务同步
*/
@Override
public void syncProdDataJob() {
syncProdData(2);
}
/**
* 同步数据
*/
@Transactional(rollbackFor = Exception.class)
public void syncProdData(Integer dataSyncType) {
try {
// 获取AccessToken
String params = "appkey=" + aliDingConfig.getAppKey()
+ "&appsecret=" + aliDingConfig.getAppSecret();
String tokenRes = HttpUtils.sendGet(aliDingConfig.getAccessTokenUrl(), params);
JSONObject tokenObj = JSON.parseObject(tokenRes);
String accessToken = tokenObj.getString("access_token");
if (StringUtils.isEmpty(accessToken)) {
log.error("获取钉钉AccessToken失败: {}", tokenRes);
return;
}
log.info("获取AccessToken成功: {}", accessToken);
// 查询表单数据
JSONObject searchParam = new JSONObject();
searchParam.put("appType", aliDingConfig.getAppType());
searchParam.put("systemToken", aliDingConfig.getSystemToken());
searchParam.put("userId", aliDingConfig.getUserId());
searchParam.put("formUuid", aliDingConfig.getFormUuid());
String dataRes = HttpUtils.sendPostJson(
aliDingConfig.getSearchFormDataUrl(),
searchParam.toJSONString(),
StandardCharsets.UTF_8.name(),
null,
accessToken
);
if (StringUtils.isEmpty(dataRes)) {
log.error("拉取宜搭数据为空");
return;
}
JSONObject resultObj = JSON.parseObject(dataRes);
JSONArray dataArr = resultObj.getJSONArray("data");
if (dataArr == null || dataArr.isEmpty()) {
log.warn("没有获取到表单数据");
return;
}
List list = new ArrayList<>();
// 解析表单
for (int i = 0; i < dataArr.size(); i++) {
JSONObject item = dataArr.getJSONObject(i);
String formInstanceId = item.getString("formInstanceId");
String serialNo = item.getString("serialNo");
// 发起人
JSONObject originator = item.getJSONObject("originator");
String originatorName = originator.getJSONObject("userName").getString("nameInChinese");
JSONObject formData = item.getJSONObject("formData");
// 明细表
JSONArray tableArr = formData.getJSONArray("tableField_l7fytfcn");
if (tableArr == null || tableArr.isEmpty()) {
continue;
}
// 解析明细
for (int j = 0; j < tableArr.size(); j++) {
JSONObject row = tableArr.getJSONObject(j);
ProductionPlan plan = new ProductionPlan();
// 表单信息
plan.setFormInstanceId(formInstanceId);
plan.setSerialNo(serialNo);
// 表头字段
plan.setApplyNo(formData.getString("textField_l7fytfco"));
plan.setCustomerName(formData.getString("textField_lbkozohg"));
// 明细字段
plan.setMaterialCode(row.getString("textField_l9xo62q5"));
plan.setProductName(row.getString("textField_l9xo62q7"));
plan.setProductSpec(row.getString("textField_l9xo62q8"));
plan.setLength(row.getInteger("numberField_lb7lgatg_value"));
plan.setWidth(row.getInteger("numberField_lb7lgath_value"));
plan.setHeight(row.getInteger("numberField_lb7lgati_value"));
plan.setQuantity(row.getInteger("numberField_lb7lgatj_value"));
plan.setVolume(row.getBigDecimal("numberField_l7fytfd3_value"));
plan.setStrength(row.getString("radioField_m9urarr2_id"));
// 日期区间
JSONArray dateArr = row.getJSONArray("cascadeDateField_lfxqqluw");
if (dateArr != null && dateArr.size() == 2) {
long start = Long.parseLong(dateArr.getString(0));
long end = Long.parseLong(dateArr.getString(1));
plan.setStartDate(Instant.ofEpochMilli(start)
.atZone(ZoneId.systemDefault())
.toLocalDateTime());
plan.setEndDate(Instant.ofEpochMilli(end)
.atZone(ZoneId.systemDefault())
.toLocalDateTime());
}
// 提交人
plan.setSubmitter(originatorName);
// 组织
plan.setSubmitOrg("宁夏中创绿能实业集团有限公司");
// 备注
plan.setRemarkOne(formData.getString("textareaField_l7fytfcy"));
plan.setRemarkTwo(formData.getString("textField_l7fytfcx"));
// 创建人
plan.setCreatorName(originatorName);
// 修改人
JSONObject modifyUser = item.getJSONObject("modifyUser");
if (modifyUser != null) {
plan.setModifierName(modifyUser.getJSONObject("userName").getString("nameInChinese"));
}
// 表单时间
plan.setFormCreatedTime(parseUtcTime(item.getString("createdTimeGMT")));
plan.setFormModifiedTime(parseUtcTime(item.getString("modifiedTimeGMT")));
// 同步信息
plan.setDataSyncType(dataSyncType);
plan.setDataSourceType(1);
// 数据库时间
LocalDateTime now = LocalDateTime.now();
plan.setCreateTime(now);
plan.setUpdateTime(now);
list.add(plan);
}
}
if (!list.isEmpty()) {
saveBatch(list);
}
log.info("生产计划同步完成,共 {} 条", list.size());
} catch (Exception e) {
log.error("同步生产计划异常", e);
}
}
private LocalDateTime parseUtcTime(String utcString) {
if (StringUtils.isEmpty(utcString)) {
return null;
}
try {
OffsetDateTime odt = OffsetDateTime.parse(utcString);
return odt.toLocalDateTime();
} catch (DateTimeParseException ex) {
log.warn("解析时间 {} 失败: {}", utcString, ex.getMessage());
return null;
}
}
}