| | |
| | | package com.ruoyi.basic.service.impl; |
| | | |
| | | |
| | | import com.alibaba.fastjson2.JSONArray; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.framework.config.AliDingConfig; |
| | | import com.ruoyi.framework.security.LoginUser; |
| | | import com.ruoyi.framework.util.AliDingUtils; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.production.enums.MaterialConfigTypeEnum; |
| | | import com.ruoyi.production.pojo.ProductMaterial; |
| | | import com.ruoyi.production.pojo.ProductMaterialSku; |
| | | import com.ruoyi.productionPlan.enums.DataSourceTypeEnum; |
| | | import com.ruoyi.productionPlan.pojo.ProductionPlan; |
| | | import com.ruoyi.project.system.domain.SysUser; |
| | | import com.ruoyi.sales.mapper.SalesLedgerMapper; |
| | | import com.ruoyi.sales.pojo.SalesLedger; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import java.time.Instant; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.ZoneId; |
| | | import java.util.*; |
| | | import java.util.concurrent.locks.ReentrantLock; |
| | | import java.util.stream.Collectors; |
| | | |
| | | |
| | |
| | | private CustomerFollowUpFileService customerFollowUpFileService; |
| | | |
| | | private CustomerReturnVisitService customerReturnVisitService; |
| | | |
| | | private AliDingConfig aliDingConfig; |
| | | |
| | | /** |
| | | * 忥éï¼é²æ¢æå¨å宿¶ä»»å¡åæ¶æ§è¡ |
| | | */ |
| | | private final ReentrantLock syncLock = new ReentrantLock(); |
| | | |
| | | /** |
| | | * æ¥è¯¢å®¢æ·æ¡£æ¡ |
| | |
| | | } |
| | | |
| | | @Override |
| | | public void syncCustomerJob() { |
| | | syncCustomerData(2); |
| | | } |
| | | |
| | | @Override |
| | | public List<Map<String, Object>> customerList(Customer customer) { |
| | | LambdaQueryWrapper<Customer> queryWrapper = Wrappers.lambdaQuery(); |
| | | queryWrapper.select(Customer::getId, Customer::getCustomerName, Customer::getTaxpayerIdentificationNumber); |
| | |
| | | } |
| | | return sb.toString(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * åæ¥æ°æ® |
| | | */ |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void syncCustomerData(Integer dataSyncType) { |
| | | if (!syncLock.tryLock()) { |
| | | log.warn("忥æ£å¨è¿è¡ä¸ï¼æ¬æ¬¡ {} åæ¥è¯·æ±è¢«è·³è¿", dataSyncType == 1 ? "æå¨" : "宿¶ä»»å¡"); |
| | | return; |
| | | } |
| | | try { |
| | | JSONArray searchConditions = new JSONArray(); |
| | | JSONObject statusCondition = new JSONObject(); |
| | | statusCondition.put("key", "processInstanceStatus"); |
| | | JSONArray statusValueArray = new JSONArray(); |
| | | statusValueArray.add("COMPLETED"); |
| | | statusCondition.put("value", statusValueArray); |
| | | statusCondition.put("type", "ARRAY"); |
| | | statusCondition.put("operator", "in"); |
| | | statusCondition.put("componentName", "SelectField"); |
| | | searchConditions.add(statusCondition); |
| | | |
| | | JSONObject resultCondition = new JSONObject(); |
| | | resultCondition.put("key", "processApprovedResult"); |
| | | JSONArray resultValueArray = new JSONArray(); |
| | | resultValueArray.add("agree"); |
| | | resultCondition.put("value", resultValueArray); |
| | | resultCondition.put("type", "ARRAY"); |
| | | resultCondition.put("operator", "in"); |
| | | resultCondition.put("componentName", "SelectField"); |
| | | searchConditions.add(resultCondition); |
| | | |
| | | String searchFieldJson = searchConditions.toJSONString(); |
| | | |
| | | JSONArray dataArr = AliDingUtils.getFormDataList(aliDingConfig, aliDingConfig.getCustomerCodeFormUuid(), searchFieldJson, this, Customer::getFormModifiedTime); |
| | | |
| | | if (dataArr.isEmpty()) { |
| | | log.info("æ²¡ææ´å¤æ°æ°æ®éè¦åæ¥"); |
| | | return; |
| | | } |
| | | |
| | | // è§£æå¹¶ä¿åæ°æ® |
| | | List<Customer> list = parseCustomer(dataArr); |
| | | if (!list.isEmpty()) { |
| | | // å¤çæ´æ°ææ°å¢ |
| | | int affected = processSaveOrUpdate(list); |
| | | log.info("å®¢æ·æ°æ®åæ¥å®æï¼å
±åæ¥ {} æ¡æ°æ®", affected); |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | log.error("忥客æ·ä¿¡æ¯å¼å¸¸", e); |
| | | } finally { |
| | | // éæ¾é |
| | | syncLock.unlock(); |
| | | } |
| | | } |
| | | |
| | | private List<Customer> parseCustomer(JSONArray dataArr) { |
| | | List<Customer> list = new ArrayList<>(); |
| | | for (int i = 0; i < dataArr.size(); i++) { |
| | | JSONObject item = dataArr.getJSONObject(i); |
| | | String formInstanceId = item.getString("formInstanceId"); |
| | | JSONObject formData = item.getJSONObject("formData"); |
| | | Customer customer = new Customer(); |
| | | customer.setCustomerName(formData.getString("textField_l7fwg8uh")); |
| | | customer.setTaxpayerIdentificationNumber(formData.getString("textField_l88df8ae")); |
| | | customer.setCompanyAddress(formData.getString("textField_l7fwg8uj")); |
| | | customer.setCompanyPhone(formData.getString("textField_lb38bng2")); |
| | | customer.setContactPerson(formData.getString("textField_l7fwg8ut")); |
| | | customer.setContactPhone(formData.getString("textField_l7fwg8uu")); |
| | | customer.setMaintainer("管çåè´¦å·"); |
| | | LocalDateTime dateTime = AliDingUtils.parseUtcTime(item.getString("modifiedTimeGMT")); |
| | | ZoneId zoneId = ZoneId.of("Asia/Shanghai"); |
| | | Date date = Date.from(dateTime.atZone(zoneId).toInstant()); |
| | | customer.setMaintenanceTime(date); |
| | | customer.setFormInstanceId(formInstanceId); |
| | | customer.setFormModifiedTime(dateTime); |
| | | list.add(customer); |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | private int processSaveOrUpdate(List<Customer> list) { |
| | | if (list == null || list.isEmpty()) { |
| | | return 0; |
| | | } |
| | | int affected = 0; |
| | | |
| | | for (Customer customer : list) { |
| | | |
| | | LambdaQueryWrapper<Customer> wrapper = new LambdaQueryWrapper<>(); |
| | | wrapper.eq(Customer::getFormInstanceId, customer.getFormInstanceId()); |
| | | |
| | | Customer exist = this.getOne(wrapper); |
| | | if (exist == null) { |
| | | this.save(customer); |
| | | affected++; |
| | | log.info("æ°å¢å®¢æ·ä¿¡æ¯ {}", customer.getCustomerName()); |
| | | } else { |
| | | if (exist.getFormModifiedTime() == null || !exist.getFormModifiedTime().equals(customer.getFormModifiedTime())) { |
| | | customer.setId(exist.getId()); |
| | | this.updateById(customer); |
| | | affected++; |
| | | log.info("æ´æ°å®¢æ·ä¿¡æ¯ {}", customer.getCustomerName()); |
| | | } |
| | | } |
| | | } |
| | | return affected; |
| | | } |
| | | } |