Commit a421dc8c by HlQ

[add]

1.添加项目干系人和项目交付日志功能
2.设备返修和备件申请支持文件上传
3.工单管理模块的人员分析和项目分析添加人员查询字段
4.支持钉钉内部 H5 应用获取 token
5.巡检列表返回文件数量
[fix]
1.修改项目合并的 bug
2.合同同步 bug 修改
1 parent 8cb74aa8
Showing 36 changed files with 907 additions and 126 deletions
package vion.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import lombok.RequiredArgsConstructor;
import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.lang.Assert;
import org.springframework.web.bind.annotation.*;
import vion.dto.DeliverLogDTO;
import vion.service.IDeliverLogService;
import vion.vo.DeliverLogVO;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/deliverLog")
public class DeliverLogController {
private final IDeliverLogService deliverLogService;
@GetMapping
@SaCheckPermission(value = "deliverLog:list", orRole = "admin")
public Map<String, TreeMap<String, List<DeliverLogVO>>> list(DeliverLogDTO dto) {
Assert.isTrue(ArrayUtil.isAllNotNull(dto.getLogDateStart(), dto.getLogDateEnd()), "查询时间范围不能为空");
return deliverLogService.list(dto);
}
@GetMapping("/{id}")
@SaCheckPermission(value = "deliverLog:query", orRole = "admin")
public DeliverLogVO getById(@PathVariable Long id) {
return deliverLogService.getById(id);
}
@PostMapping
@SaCheckPermission(value = "deliverLog:save", orRole = "admin")
public String save(@RequestBody List<DeliverLogDTO> deliverLogDTOList) {
return deliverLogService.save(deliverLogDTOList);
}
@PostMapping("/{id}")
@SaCheckPermission(value = "deliverLog:edit", orRole = "admin")
public String update(@PathVariable Long id, @RequestBody DeliverLogDTO dto) {
dto.setId(id);
return deliverLogService.update(dto);
}
@DeleteMapping("/{id}")
@SaCheckPermission(value = "deliverLog:remove", orRole = "admin")
public String remove(@PathVariable Long id) {
return deliverLogService.removeById(id) ? "删除成功" : "删除失败";
}
}
...@@ -46,7 +46,7 @@ public class RepairRecController { ...@@ -46,7 +46,7 @@ public class RepairRecController {
@PostMapping("/{id}") @PostMapping("/{id}")
@SaCheckPermission(value = "repairRec:edit", orRole = "admin") @SaCheckPermission(value = "repairRec:edit", orRole = "admin")
public String updById(@PathVariable Long id, @RequestBody RepairRecDTO dto) { public String updById(@PathVariable Long id, RepairRecDTO dto) {
return repairRecService.updById(id, dto); return repairRecService.updById(id, dto);
} }
...@@ -56,4 +56,10 @@ public class RepairRecController { ...@@ -56,4 +56,10 @@ public class RepairRecController {
return repairRecService.removeById(id) ? "删除成功" : "删除失败"; return repairRecService.removeById(id) ? "删除成功" : "删除失败";
} }
@GetMapping("/notify")
@SaCheckPermission(value = "repairRec:notify", orRole = "admin")
public String notify(Long id, String userid) {
return repairRecService.notify(id, userid) ? "钉钉提醒成功" : "钉钉提醒失败";
}
} }
...@@ -60,7 +60,7 @@ public class SparePartController { ...@@ -60,7 +60,7 @@ public class SparePartController {
@PostMapping("/{id}") @PostMapping("/{id}")
@SaCheckPermission(value = "sparePart:edit", orRole = "admin") @SaCheckPermission(value = "sparePart:edit", orRole = "admin")
public String updById(@PathVariable Long id, @RequestBody SparePartDTO dto) { public String updById(@PathVariable Long id, SparePartDTO dto) {
return sparePartService.updById(id, dto); return sparePartService.updById(id, dto);
} }
...@@ -98,4 +98,10 @@ public class SparePartController { ...@@ -98,4 +98,10 @@ public class SparePartController {
} }
} }
@GetMapping("/notify")
@SaCheckPermission(value = "sparePart:notify", orRole = "admin")
public String notify(Long id, String userid) {
return sparePartService.notify(id, userid) ? "钉钉提醒成功" : "钉钉提醒失败";
}
} }
...@@ -15,9 +15,8 @@ import org.dromara.hutool.core.util.ObjUtil; ...@@ -15,9 +15,8 @@ import org.dromara.hutool.core.util.ObjUtil;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import vion.dto.StatusDTO; import vion.dto.StatusDTO;
import vion.dto.StoreDTO; import vion.dto.StoreDTO;
import vion.model.RStoreUser; import vion.model.*;
import vion.model.Store; import vion.service.IRStoreConfederateService;
import vion.model.StoreLog;
import vion.service.IRStoreUserService; import vion.service.IRStoreUserService;
import vion.service.IStoreLogService; import vion.service.IStoreLogService;
import vion.service.IStoreService; import vion.service.IStoreService;
...@@ -37,9 +36,10 @@ public class StoreController { ...@@ -37,9 +36,10 @@ public class StoreController {
private final IStoreService storeService; private final IStoreService storeService;
private final IRStoreUserService storeUserService; private final IRStoreUserService storeUserService;
private final IStoreLogService storeLogService; private final IStoreLogService storeLogService;
private final IRStoreConfederateService storeConfederateService;
private final Converter converter; private final Converter converter;
@GetMapping("/stores") @PostMapping("/store")
@SaCheckPermission(value = "store:list", orRole = "admin") @SaCheckPermission(value = "store:list", orRole = "admin")
public Page<StoreVO> getStoreList(StoreDTO data, @RequestBody(required = false) List<OrderItem> orderItemList) { public Page<StoreVO> getStoreList(StoreDTO data, @RequestBody(required = false) List<OrderItem> orderItemList) {
return storeService.getStoreList(data, orderItemList); return storeService.getStoreList(data, orderItemList);
...@@ -190,4 +190,34 @@ public class StoreController { ...@@ -190,4 +190,34 @@ public class StoreController {
return storeService.statState(); return storeService.statState();
} }
@GetMapping("/store/confederate")
@SaCheckPermission(value = "store:confederate:list", orRole = "admin")
public Page<RStoreConfederate> list(RStoreConfederate storeConfederate) {
return storeConfederateService.lambdaQuery(storeConfederate).page(Page.of(storeConfederate.getPageNum(), storeConfederate.getPageSize()));
}
@GetMapping("/store/confederate/{id}")
@SaCheckPermission(value = "store:confederate:query", orRole = "admin")
public RStoreConfederate getById(@PathVariable Long id) {
return storeConfederateService.getById(id);
}
@PostMapping("/store/confederate")
@SaCheckPermission(value = "store:confederate:save", orRole = "admin")
public String save(@RequestBody RStoreConfederate storeConfederate) {
return storeConfederateService.save(storeConfederate) ? "新增成功" : "新增失败";
}
@PostMapping("/store/confederate/{id}")
@SaCheckPermission(value = "store:confederate:edit", orRole = "admin")
public String update(@PathVariable Long id, @RequestBody RStoreConfederate storeConfederate) {
storeConfederate.setId(id);
return storeConfederateService.updateById(storeConfederate) ? "修改成功" : "修改失败";
}
@DeleteMapping("/store/confederate/{id}")
@SaCheckPermission(value = "store:confederate:remove", orRole = "admin")
public String remove(@PathVariable Long id) {
return storeConfederateService.removeById(id) ? "删除成功" : "删除失败";
}
} }
...@@ -144,16 +144,17 @@ public class TaskController { ...@@ -144,16 +144,17 @@ public class TaskController {
public List<Map<String, Object>> peopleAnalysis(@DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, public List<Map<String, Object>> peopleAnalysis(@DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
@DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate, @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate,
Integer source, Integer source,
Long userId) { Long[] userIds) {
return taskService.peopleAnalysis(startDate, endDate, source, userId); return taskService.peopleAnalysis(startDate, endDate, source, userIds);
} }
@GetMapping("/task/proAnal") @GetMapping("/task/proAnal")
@SaCheckPermission(value = "task:proAnal", orRole = "admin") @SaCheckPermission(value = "task:proAnal", orRole = "admin")
public List<Map<String, Object>> proAnalysis(@DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, public List<Map<String, Object>> proAnalysis(@DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
@DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate, @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate,
Integer source) { Integer source,
return taskService.proAnalysis(startDate, endDate, source); Long[] userIds) {
return taskService.proAnalysis(startDate, endDate, source, userIds);
} }
@GetMapping("/task/summaryAnal") @GetMapping("/task/summaryAnal")
......
...@@ -103,6 +103,11 @@ public class UserController { ...@@ -103,6 +103,11 @@ public class UserController {
return dingMod.dingCallback(target, dto, res); return dingMod.dingCallback(target, dto, res);
} }
@GetMapping("/ding/getPlatformToken")
public Object getPlatformToken(String authCode) {
return dingMod.getPlatformToken(authCode);
}
@GetMapping("/logout") @GetMapping("/logout")
public String logout() { public String logout() {
StpUtil.logout(); StpUtil.logout();
......
package vion.cron; package vion.cron;
import cn.hutool.core.util.NumberUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.hutool.core.collection.CollUtil; import org.dromara.hutool.core.collection.CollUtil;
import org.dromara.hutool.core.collection.ListUtil; import org.dromara.hutool.core.collection.ListUtil;
import org.dromara.hutool.core.date.DateUtil; import org.dromara.hutool.core.date.DateUtil;
import org.dromara.hutool.core.lang.Opt; import org.dromara.hutool.core.lang.Opt;
import org.dromara.hutool.core.math.NumberUtil;
import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.util.ObjUtil; import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.hutool.crypto.SecureUtil; import org.dromara.hutool.crypto.SecureUtil;
...@@ -56,7 +56,7 @@ public class ContractRunner { ...@@ -56,7 +56,7 @@ public class ContractRunner {
@Value("${xbongbong.corpid}") @Value("${xbongbong.corpid}")
private String corpid; private String corpid;
@Scheduled(cron = "0 0 * * * *") // @Scheduled(cron = "0 0 * * * *")
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void contractSync() { public void contractSync() {
log.info("【开始】从crm系统同步合同信息"); log.info("【开始】从crm系统同步合同信息");
...@@ -297,40 +297,74 @@ public class ContractRunner { ...@@ -297,40 +297,74 @@ public class ContractRunner {
log.info("【结束】从crm系统同步合同信息"); log.info("【结束】从crm系统同步合同信息");
} }
// @Scheduled(cron = "0 0 * * * *") @Scheduled(cron = "0 0 * * * *")
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void contractSync1() { public void contractSync1() {
String modifyTime = Opt.ofNullable((String) redissonClient.getBucket(RedisKeyEnum.CONTRACT_SYNC_NEW_TIME.getVal()).get()).orElse("0"); Long modifyTime = Opt.ofNullable((Long) redissonClient.getBucket(RedisKeyEnum.CONTRACT_SYNC_NEW_TIME.getVal()).get()).orElse(0L);
// 只同步2024-05-07号(含)之后的合同
var json = JSONUtil.ofObj() var json = JSONUtil.ofObj()
.set("sortMap", JSONUtil.ofObj() .set("sortMap", JSONUtil.ofObj()
.set("field", "updateTime") .set("field", "updateTime")
.set("order", "desc")) .set("sort", "desc"))
.set("conditions", JSONUtil.ofArray() .set("conditions", JSONUtil.ofArray()
.put(JSONUtil.ofObj() .put(JSONUtil.ofObj()
.set("attr", "date_3")
.set("symbol", "greaterequal")
.set("value", new String[]{"1715356800"}))
.put(JSONUtil.ofObj()
.set("attr", "updateTime") .set("attr", "updateTime")
.set("fieldType", "10015")
.set("symbol", "greatethan") .set("symbol", "greatethan")
.set("value", new String[]{"1713324916"})) .set("value", new String[]{String.valueOf(modifyTime / 1000)}))
) )
.set("corpid", corpid) .set("corpid", corpid)
.set("formId", 8429903); .set("formId", 8429903)
.set("pageSize", 100);
var res = Request.of("https://proapi.xbongbong.com/pro/v2/api/contract/list") var res = Request.of("https://proapi.xbongbong.com/pro/v2/api/contract/list")
.header("sign", SecureUtil.sha256(json.toString() + token)) .header("sign", SecureUtil.sha256(json.toString() + token))
.body(json.toString()) .body(json.toString())
.method(Method.POST) .method(Method.POST)
.send(); .send();
var jobj = JSONUtil.parseObj(res.bodyStr()); var jobO = JSONUtil.parseObj(res.bodyStr());
if (jobj.getInt("code") != 1) { if (jobO.getInt("code") != 1) {
log.error("获取合同列表失败,错误原因:{}", jobj); log.error("获取合同列表失败,错误原因:{}", jobO);
return; return;
} }
var jsonArray = jobj.getJSONObject("result").getJSONArray("list"); Integer cnt = jobO.getJSONObject("result").getInt("totalCount");
var dataIdList = jsonArray.stream().map(v -> JSONUtil.parseObj(v).getInt("dataId")).toList(); Integer page = jobO.getJSONObject("result").getInt("totalPage");
if (CollUtil.isEmpty(dataIdList)) { if (NumberUtil.equals(cnt, 0)) {
log.info("没有需要插入或更新的合同"); log.info("没有需要插入或更新的合同");
return; return;
} }
var jsonArray = jobO.getJSONObject("result").getJSONArray("list");
var dataIdSet = jsonArray.stream().map(v -> JSONUtil.parseObj(v).getInt("dataId")).collect(Collectors.toSet());
for (int i = 2; i <= page; i++) {
var jsonR = JSONUtil.ofObj()
.set("sortMap", JSONUtil.ofObj()
.set("field", "updateTime")
.set("order", "desc"))
.set("conditions", JSONUtil.ofArray()
.put(JSONUtil.ofObj()
.set("attr", "updateTime")
.set("fieldType", "10015")
.set("symbol", "greatethan")
.set("value", new String[]{String.valueOf(modifyTime)}))
)
.set("corpid", corpid)
.set("formId", 8429903)
.set("page", i)
.set("pageSize", 100);
var resR = Request.of("https://proapi.xbongbong.com/pro/v2/api/contract/list")
.header("sign", SecureUtil.sha256(jsonR.toString() + token))
.body(json.toString())
.method(Method.POST)
.send();
var jobR = JSONUtil.parseObj(resR.bodyStr());
var jsonArrR = jobR.getJSONObject("result").getJSONArray("list");
var dataIdSetR = jsonArrR.stream().map(v -> JSONUtil.parseObj(v).getInt("dataId")).collect(Collectors.toSet());
dataIdSet.addAll(dataIdSetR);
}
Map<String, Integer> contractTypeMap = dictionaryService.lambdaQuery().eq(Dictionary::getType, "contract_type").list().stream().collect(Collectors.toMap(Dictionary::getValue, Dictionary::getKey)); Map<String, Integer> contractTypeMap = dictionaryService.lambdaQuery().eq(Dictionary::getType, "contract_type").list().stream().collect(Collectors.toMap(Dictionary::getValue, Dictionary::getKey));
...@@ -341,7 +375,7 @@ public class ContractRunner { ...@@ -341,7 +375,7 @@ public class ContractRunner {
log.error("获取CRM产品信息为空"); log.error("获取CRM产品信息为空");
return; return;
} }
dataIdList.forEach(dataId -> { dataIdSet.forEach(dataId -> {
var json1 = JSONUtil.ofObj() var json1 = JSONUtil.ofObj()
.set("corpid", corpid) .set("corpid", corpid)
.set("dataId", dataId); .set("dataId", dataId);
...@@ -364,6 +398,11 @@ public class ContractRunner { ...@@ -364,6 +398,11 @@ public class ContractRunner {
contract.setSignDate(DateUtil.date(jsonObj1.getLong("date_1") * 1000)); contract.setSignDate(DateUtil.date(jsonObj1.getLong("date_1") * 1000));
contract.setMaintainSdate(Opt.ofNullable(jsonObj1.getLong("date_4")).map(sec -> DateUtil.date(sec * 1000)).orElse(null)); contract.setMaintainSdate(Opt.ofNullable(jsonObj1.getLong("date_4")).map(sec -> DateUtil.date(sec * 1000)).orElse(null));
contract.setMaintainEdate(Opt.ofNullable(jsonObj1.getLong("date_5")).map(sec -> DateUtil.date(sec * 1000)).orElse(null)); contract.setMaintainEdate(Opt.ofNullable(jsonObj1.getLong("date_5")).map(sec -> DateUtil.date(sec * 1000)).orElse(null));
String warrantyPeriod = Opt.ofNullable(jsonObj1.getJSONObject("text_23")).map(wp -> wp.getStr("text")).orElse("");
if (StrUtil.isNotBlank(warrantyPeriod) && warrantyPeriod.contains("个月")) {
String substring = warrantyPeriod.substring(0, (warrantyPeriod.length() - 2));
contract.setWarrantyPeriod(Integer.parseInt(substring));
}
contract.setStatus(1); contract.setStatus(1);
contract.setTotalAmount(jsonObj1.getBigDecimal("num_1")); contract.setTotalAmount(jsonObj1.getBigDecimal("num_1"));
contract.setPaidAmount(BigDecimal.ZERO); contract.setPaidAmount(BigDecimal.ZERO);
...@@ -425,7 +464,7 @@ public class ContractRunner { ...@@ -425,7 +464,7 @@ public class ContractRunner {
var contractProduct = new RContractProduct(); var contractProduct = new RContractProduct();
contractProduct.setContractNo(contract.getContractNo()); contractProduct.setContractNo(contract.getContractNo());
contractProduct.setProductName(crmPro.getStr("text_1")); contractProduct.setProductName(crmPro.getStr("text_1"));
contractProduct.setProductCode(crmPro.getStr("text_17")); contractProduct.setProductCode(crmPro.getStr("serialNo"));
contractProduct.setProductModel(crmPro.getStr("text_4")); contractProduct.setProductModel(crmPro.getStr("text_4"));
contractProduct.setNum(product.getInt("num_3")); contractProduct.setNum(product.getInt("num_3"));
contractProduct.setTaxPrice(product.getBigDecimal("num_1")); contractProduct.setTaxPrice(product.getBigDecimal("num_1"));
...@@ -437,8 +476,8 @@ public class ContractRunner { ...@@ -437,8 +476,8 @@ public class ContractRunner {
contractProduct.setTotalPrice(product.getBigDecimal("num_5")); contractProduct.setTotalPrice(product.getBigDecimal("num_5"));
productList.add(contractProduct); productList.add(contractProduct);
}); });
contractProductService.saveBatch(productList);
}); });
contractProductService.saveBatch(productList);
Map<String, Contract> no2ContactMap = contractService.list().stream().collect(Collectors.toMap(Contract::getContractNo, Function.identity())); Map<String, Contract> no2ContactMap = contractService.list().stream().collect(Collectors.toMap(Contract::getContractNo, Function.identity()));
...@@ -629,6 +668,5 @@ public class ContractRunner { ...@@ -629,6 +668,5 @@ public class ContractRunner {
log.info("【开始】计算门店维保状态"); log.info("【开始】计算门店维保状态");
storeService.calMaintainStatus(ListUtil.empty()); storeService.calMaintainStatus(ListUtil.empty());
log.info("【结束】计算门店维保状态"); log.info("【结束】计算门店维保状态");
} }
} }
package vion.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Getter
@Setter
public class DeliverLogDTO extends BaseDTO {
private Long id;
/**
* 集团id
*/
private Long accountId;
/**
* 项目id
*/
private Long storeId;
/**
* 合同编号
*/
private String contractNo;
/**
* 日志人
*/
private Long userId;
/**
* 日志日期
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date logDate;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date logDateStart;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date logDateEnd;
/**
* 干系人
*/
private Long confederateId;
/**
* 服务方式
*/
private Integer serviceType;
/**
* 耗时
*/
private Double logHour;
/**
* 工作内容
*/
private String content;
}
\ No newline at end of file \ No newline at end of file
...@@ -86,6 +86,7 @@ public class RepairRecDTO extends BaseDTO { ...@@ -86,6 +86,7 @@ public class RepairRecDTO extends BaseDTO {
* 发货日期 * 发货日期
*/ */
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date shipDate; private Date shipDate;
/** /**
......
...@@ -81,6 +81,7 @@ public class SparePartDTO extends BaseDTO { ...@@ -81,6 +81,7 @@ public class SparePartDTO extends BaseDTO {
* 发货日期 * 发货日期
*/ */
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date shipDate; private Date shipDate;
/** /**
......
...@@ -19,7 +19,8 @@ public class InterceptorConfig implements WebMvcConfigurer { ...@@ -19,7 +19,8 @@ public class InterceptorConfig implements WebMvcConfigurer {
})) }))
.addPathPatterns("/api/**") .addPathPatterns("/api/**")
.excludePathPatterns("/api/dictionarys") .excludePathPatterns("/api/dictionarys")
.excludePathPatterns("/api/upLoadFile", "/api/ding/callback/**", "/api/wechat/**", "/error") .excludePathPatterns("/api/upLoadFile", "/api/ding/callback/**", "/api/ding/getPlatformToken", "/api" +
"/wechat/**", "/error")
.excludePathPatterns("/api/order/sign/*") .excludePathPatterns("/api/order/sign/*")
.excludePathPatterns("/api/form/sign/*") .excludePathPatterns("/api/form/sign/*")
.excludePathPatterns("/api/wechatCallback") .excludePathPatterns("/api/wechatCallback")
......
package vion.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import vion.model.DeliverLog;
/**
* @author HlQ
* @date 2024/5/21
*/
public interface DeliverLogMapper extends MPJBaseMapper<DeliverLog> {
}
\ No newline at end of file \ No newline at end of file
package vion.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vion.model.RStoreConfederate;
/**
* @author HlQ
* @date 2024/5/21
*/
public interface RStoreConfederateMapper extends BaseMapper<RStoreConfederate> {
}
\ No newline at end of file \ No newline at end of file
package vion.model;
import com.baomidou.mybatisplus.annotation.*;
import io.github.linpeilie.annotations.AutoMapper;
import io.github.linpeilie.annotations.AutoMappers;
import lombok.Data;
import vion.dto.DeliverLogDTO;
import vion.vo.DeliverLogVO;
import java.util.Date;
/**
* 项目交付人员日志
*/
@Data
@TableName(value = "tbl_deliver_log")
@AutoMappers({
@AutoMapper(target = DeliverLogVO.class),
@AutoMapper(target = DeliverLogDTO.class),
})
public class DeliverLog {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 集团id
*/
@TableField(value = "account_id")
private Long accountId;
/**
* 项目id
*/
@TableField(value = "store_id")
private Long storeId;
/**
* 合同编号
*/
@TableField(value = "contract_no")
private String contractNo;
/**
* 日志人
*/
@TableField(value = "user_id")
private Long userId;
/**
* 日志日期
*/
@TableField(value = "log_date")
private Date logDate;
/**
* 干系人
*/
@TableField(value = "confederate_id")
private Long confederateId;
/**
* 服务方式
*/
@TableField(value = "service_type")
private Integer serviceType;
/**
* 耗时
*/
@TableField(value = "log_hour")
private Double logHour;
/**
* 工作内容
*/
@TableField(value = "content")
private String content;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
/**
* 修改时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
\ No newline at end of file \ No newline at end of file
...@@ -40,6 +40,7 @@ public class FileInfo { ...@@ -40,6 +40,7 @@ public class FileInfo {
/** 合同id */ /** 合同id */
private Long contractId; private Long contractId;
/** 文件名称 */ /** 文件名称 */
@TableField(condition = SqlCondition.LIKE)
private String name; private String name;
/** 文件地址 */ /** 文件地址 */
private String url; private String url;
......
package vion.model;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import vion.dto.BaseDTO;
import java.util.Date;
/**
* 项目干系人
*/
@Data
@TableName(value = "r_store_confederate")
public class RStoreConfederate extends BaseDTO {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 项目id
*/
@TableField(value = "store_id")
private Long storeId;
/**
* 职位
*/
@TableField(value = "\"position\"")
private String position;
/**
* 姓名
*/
@TableField(value = "\"name\"", condition = SqlCondition.LIKE)
private String name;
/**
* 备注
*/
@TableField(value = "remark")
private String remark;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 修改时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
}
\ No newline at end of file \ No newline at end of file
package vion.model; package vion.model;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
import java.util.Date; import java.util.Date;
...@@ -28,8 +29,10 @@ public class RStoreTag { ...@@ -28,8 +29,10 @@ public class RStoreTag {
private Long tagId; private Long tagId;
@TableField(value = "create_time", fill = FieldFill.INSERT) @TableField(value = "create_time", fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime; private Date createTime;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime; private Date updateTime;
} }
\ No newline at end of file \ No newline at end of file
...@@ -36,11 +36,11 @@ public class Store { ...@@ -36,11 +36,11 @@ public class Store {
*/ */
private String customerName; private String customerName;
/** /**
* 实施类型:0纯供货、1供货+安装、3续保、4维修 * 实施类型:1纯供货、2供货+安装、3续保、4维修
*/ */
private Integer implementType; private Integer implementType;
/** /**
* 项目状态:0待确认、1进行中、2已完成、3挂起 * 项目状态:1待确认、2进行中、3已完成、4挂起
*/ */
private Integer projectState; private Integer projectState;
/** /**
......
package vion.service;
import com.github.yulichang.base.MPJBaseService;
import vion.dto.DeliverLogDTO;
import vion.model.DeliverLog;
import vion.vo.DeliverLogVO;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public interface IDeliverLogService extends MPJBaseService<DeliverLog> {
Map<String, TreeMap<String, List<DeliverLogVO>>> list(DeliverLogDTO dto);
DeliverLogVO getById(Long id);
String save(List<DeliverLogDTO> deliverLogDTOList);
String update(DeliverLogDTO dto);
}
package vion.service;
import vion.model.RStoreConfederate;
import com.baomidou.mybatisplus.extension.service.IService;
public interface IRStoreConfederateService extends IService<RStoreConfederate> {
}
...@@ -20,4 +20,7 @@ public interface IRepairRecService extends MPJBaseService<RepairRec> { ...@@ -20,4 +20,7 @@ public interface IRepairRecService extends MPJBaseService<RepairRec> {
RepairRecVO getRepairRecDetail(Long id, String uuid); RepairRecVO getRepairRecDetail(Long id, String uuid);
String updById(Long id, RepairRecDTO dto); String updById(Long id, RepairRecDTO dto);
Boolean notify(Long id, String userid);
} }
...@@ -20,4 +20,6 @@ public interface ISparePartService extends MPJBaseService<SparePart> { ...@@ -20,4 +20,6 @@ public interface ISparePartService extends MPJBaseService<SparePart> {
SparePartVO getSparePartDetail(Long id, String uuid); SparePartVO getSparePartDetail(Long id, String uuid);
String updById(Long id, SparePartDTO dto); String updById(Long id, SparePartDTO dto);
Boolean notify(Long id, String userid);
} }
...@@ -28,7 +28,7 @@ public interface IStoreService extends MPJBaseService<Store> { ...@@ -28,7 +28,7 @@ public interface IStoreService extends MPJBaseService<Store> {
List<Map<String, Number>> fileDetail(@RequestParam List<Long> storeIdList); List<Map<String, Number>> fileDetail(@RequestParam List<Long> storeIdList);
boolean logNotify(Long id, String[] userIdStr); Boolean logNotify(Long id, String[] userIdStr);
String addCron(Long storeId, String storeName, String cronStr, String userId); String addCron(Long storeId, String storeName, String cronStr, String userId);
......
...@@ -26,9 +26,9 @@ public interface ITaskService extends MPJBaseService<Task> { ...@@ -26,9 +26,9 @@ public interface ITaskService extends MPJBaseService<Task> {
String urgeTask(Long taskId, String remark); String urgeTask(Long taskId, String remark);
List<Map<String, Object>> peopleAnalysis(Date startDate, Date endDate, Integer source, Long userId); List<Map<String, Object>> peopleAnalysis(Date startDate, Date endDate, Integer source, Long[] userIds);
List<Map<String, Object>> proAnalysis(Date startDate, Date endDate, Integer source); List<Map<String, Object>> proAnalysis(Date startDate, Date endDate, Integer source, Long[] userIds);
Map<String, Map<String, List<Task>>> summaryAnalysis(Date startDate, Date endDate, Integer source); Map<String, Map<String, List<Task>>> summaryAnalysis(Date startDate, Date endDate, Integer source);
} }
...@@ -58,7 +58,7 @@ public class ConstructionTeamServiceImpl extends MPJBaseServiceImpl<Construction ...@@ -58,7 +58,7 @@ public class ConstructionTeamServiceImpl extends MPJBaseServiceImpl<Construction
@Override @Override
public Page<RContractTeamVO> list(RContractTeamDTO dto) { public Page<RContractTeamVO> list(RContractTeamDTO dto) {
MPJLambdaWrapper<RContractTeam> wrapper = new MPJLambdaWrapper<>(converter.convert(dto, RContractTeam.class)) var wrapper = new MPJLambdaWrapper<>(converter.convert(dto, RContractTeam.class))
.selectAll(RContractTeam.class) .selectAll(RContractTeam.class)
.selectAs(Contract::getContractNo, RContractTeamVO::getContractNo) .selectAs(Contract::getContractNo, RContractTeamVO::getContractNo)
.selectAs(Contract::getName, RContractTeamVO::getContractName) .selectAs(Contract::getName, RContractTeamVO::getContractName)
......
...@@ -129,7 +129,7 @@ public class ContractServiceImpl extends MPJBaseServiceImpl<ContractMapper, Cont ...@@ -129,7 +129,7 @@ public class ContractServiceImpl extends MPJBaseServiceImpl<ContractMapper, Cont
Page<Contract> contractList = this.lambdaQuery(converter.convert(dto, Contract.class)) Page<Contract> contractList = this.lambdaQuery(converter.convert(dto, Contract.class))
.select(Contract::getId, Contract::getName, Contract::getContractNo, Contract::getType, Contract::getSignDate, Contract::getWarrantyPeriod, Contract::getFinalDate, Contract::getStatus, Contract::getSaleName, Contract::getCustomerName, Contract::getMaintainSdate, Contract::getMaintainEdate) .select(Contract::getId, Contract::getName, Contract::getContractNo, Contract::getType, Contract::getSignDate, Contract::getWarrantyPeriod, Contract::getFinalDate, Contract::getStatus, Contract::getSaleName, Contract::getCustomerName, Contract::getMaintainSdate, Contract::getMaintainEdate)
.in(CollUtil.isNotEmpty(ids), Contract::getId, ids) .in(ObjUtil.isNotNull(dto.getStoreId()), Contract::getId, ids)
.orderByDesc(Contract::getEntryTime) .orderByDesc(Contract::getEntryTime)
.page(Page.of(dto.getPageNum(), dto.getPageSize())); .page(Page.of(dto.getPageNum(), dto.getPageSize()));
List<ContractVO> contractVOList = converter.convert(contractList.getRecords(), ContractVO.class); List<ContractVO> contractVOList = converter.convert(contractList.getRecords(), ContractVO.class);
......
package vion.service.impl;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.github.linpeilie.Converter;
import lombok.RequiredArgsConstructor;
import org.dromara.hutool.core.date.DateUtil;
import org.dromara.hutool.core.lang.Opt;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.json.JSONObject;
import org.dromara.hutool.json.JSONUtil;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
import vion.constant.RedisKeyEnum;
import vion.dto.DeliverLogDTO;
import vion.mapper.DeliverLogMapper;
import vion.model.*;
import vion.service.IDeliverLogService;
import vion.service.IRStoreConfederateService;
import vion.service.IStoreService;
import vion.third.DingMod;
import vion.vo.DeliverLogVO;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class DeliverLogServiceImpl extends MPJBaseServiceImpl<DeliverLogMapper, DeliverLog> implements IDeliverLogService {
private final IStoreService storeService;
private final IRStoreConfederateService storeConfederateService;
private final RedissonClient redissonClient;
private final Converter converter;
private final DingMod dingMod;
@Override
public Map<String, TreeMap<String, List<DeliverLogVO>>> list(DeliverLogDTO dto) {
var wrapper = new MPJLambdaWrapper<>(converter.convert(dto, DeliverLog.class))
.selectAll(DeliverLog.class)
.selectAs(Store::getName, DeliverLogVO::getStoreName)
.selectAs(RStoreConfederate::getName, DeliverLogVO::getConfederateName)
.selectAs(User::getUsername, DeliverLogVO::getUserName)
.selectAs(Contract::getSaleName, DeliverLogVO::getContractSaleName)
.leftJoin(Store.class, Store::getId, DeliverLog::getStoreId)
.leftJoin(RStoreConfederate.class, RStoreConfederate::getId, DeliverLog::getConfederateId)
.leftJoin(User.class, User::getId, DeliverLog::getUserId)
.leftJoin(Contract.class, Contract::getContractNo, DeliverLog::getContractNo)
.between(DeliverLog::getLogDate, dto.getLogDateStart(), dto.getLogDateEnd());
var deliverLogList = this.selectJoinList(DeliverLogVO.class, wrapper);
return deliverLogList.stream().collect(Collectors.groupingBy(DeliverLogVO::getUserName,
Collectors.groupingBy(v -> DateUtil.formatDate(v.getLogDate()), () -> new TreeMap<String,
List<DeliverLogVO>>(Comparator.reverseOrder()), Collectors.toList())));
}
@Override
public DeliverLogVO getById(Long id) {
var wrapper = new MPJLambdaWrapper<DeliverLog>()
.selectAll(DeliverLog.class)
.selectAs(Store::getName, DeliverLogVO::getStoreName)
.selectAs(RStoreConfederate::getName, DeliverLogVO::getConfederateName)
.selectAs(User::getUsername, DeliverLogVO::getUserName)
.selectAs(Contract::getSaleName, DeliverLogVO::getContractSaleName)
.leftJoin(Store.class, Store::getId, DeliverLog::getStoreId)
.leftJoin(RStoreConfederate.class, RStoreConfederate::getId, DeliverLog::getConfederateId)
.leftJoin(User.class, User::getId, DeliverLog::getUserId)
.leftJoin(Contract.class, Contract::getContractNo, DeliverLog::getContractNo)
.eq(DeliverLog::getId, id)
.orderByDesc(DeliverLog::getUpdateTime);
return this.selectJoinOne(DeliverLogVO.class, wrapper);
}
@Override
public String save(List<DeliverLogDTO> deliverLogDTOList) {
var deliverLogList = converter.convert(deliverLogDTOList, DeliverLog.class);
var storeIdList = deliverLogList.stream().map(DeliverLog::getStoreId).toList();
var confederateIdList = deliverLogList.stream().map(DeliverLog::getConfederateId).toList();
var stores = storeService.listByIds(storeIdList);
var id2StoreMap = stores.stream().collect(Collectors.toMap(Store::getId, Function.identity()));
var confederateList = storeConfederateService.listByIds(confederateIdList);
var storeId2NameMap = confederateList.stream().collect(Collectors.toMap(RStoreConfederate::getId, RStoreConfederate::getName));
deliverLogList.forEach(deliverLog -> {
var storeId = deliverLog.getStoreId();
var store = id2StoreMap.get(storeId);
var confederateName = Opt.ofNullable(deliverLog.getConfederateId()).map(storeId2NameMap::get).orElse("暂无");
Opt.ofNullable(redissonClient.getBucket(RedisKeyEnum.DING_PREFIX.getVal() + RedisKeyEnum.USER_ID.getVal() + store.getSalesperson()).get())
.map(u -> (User) u)
.map(User::getUserid)
.ifPresent(userid -> dingMod.workMsg(buildMsg(userid, store.getName(), confederateName, deliverLog)));
});
return this.saveBatch(deliverLogList) ? "新增成功" : "新增失败";
}
@Override
public String update(DeliverLogDTO dto) {
var deliverLog = converter.convert(dto, DeliverLog.class);
var store = storeService.getById(dto.getStoreId());
var confederate = storeConfederateService.getById(dto.getConfederateId());
Opt.ofNullable(redissonClient.getBucket(RedisKeyEnum.DING_PREFIX.getVal() + RedisKeyEnum.USER_ID.getVal() + store.getSalesperson()).get())
.map(u -> (User) u)
.map(User::getUserid)
.ifPresent(userid -> dingMod.workMsg(buildMsg(userid, store.getName(),
Opt.ofNullable(confederate).map(RStoreConfederate::getName).orElse("暂无"),
deliverLog)));
return this.updateById(deliverLog) ? "修改成功" : "修改失败";
}
JSONObject buildMsg(String userid, String storeName, String confederateName, DeliverLog deliverLog) {
var jsonObj = JSONUtil.ofObj()
.set("agent_id", 2358374016L)
.set("userid_list", userid);
var msg = new JSONObject();
var content = new JSONObject();
content.set("title", "项目交付日志提醒")
.set("text", StrUtil.format("""
#### 项目:{}
#### 合同编号:{}
#### 日志提交人:{}
#### 干系人:{}
#### 工时:{}
#### 工作内容:{}
#### 发送时间:{}""", storeName,
Opt.ofBlankAble(deliverLog.getContractNo()).orElse("暂无"),
Opt.ofNullable(redissonClient.getBucket(RedisKeyEnum.DING_PREFIX.getVal() + RedisKeyEnum.USER_ID.getVal() + deliverLog.getUserId()).get()).map(u -> (User) u).map(User::getUsername).orElse("不存在该提交人"),
confederateName,
deliverLog.getLogHour(),
deliverLog.getContent(),
DateUtil.now()));
msg.set("msgtype", "markdown").set("markdown", content);
jsonObj.set("msg", msg);
return jsonObj;
}
}
package vion.service.impl; package vion.service.impl;
import org.dromara.hutool.core.collection.CollUtil;
import org.dromara.hutool.core.collection.ListUtil;
import org.dromara.hutool.core.lang.Opt;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.base.MPJBaseServiceImpl; import com.github.yulichang.base.MPJBaseServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.github.linpeilie.Converter; import io.github.linpeilie.Converter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.hutool.core.collection.CollUtil;
import org.dromara.hutool.core.collection.ListUtil;
import org.dromara.hutool.core.lang.Opt;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import vion.dto.InspectDTO; import vion.dto.InspectDTO;
import vion.mapper.InspectMapper; import vion.mapper.InspectMapper;
import vion.model.Account; import vion.model.*;
import vion.model.Form; import vion.service.IFileService;
import vion.model.Inspect;
import vion.model.Store;
import vion.service.IFormService; import vion.service.IFormService;
import vion.service.IInspectService; import vion.service.IInspectService;
import vion.vo.FormVO; import vion.vo.FormVO;
...@@ -30,6 +28,7 @@ public class InspectServiceImpl extends MPJBaseServiceImpl<InspectMapper, Inspec ...@@ -30,6 +28,7 @@ public class InspectServiceImpl extends MPJBaseServiceImpl<InspectMapper, Inspec
private final IFormService formService; private final IFormService formService;
private final Converter converter; private final Converter converter;
private final IFileService fileService;
@Override @Override
public Page<InspectVO> getInspectList(InspectDTO data) { public Page<InspectVO> getInspectList(InspectDTO data) {
...@@ -54,6 +53,18 @@ public class InspectServiceImpl extends MPJBaseServiceImpl<InspectMapper, Inspec ...@@ -54,6 +53,18 @@ public class InspectServiceImpl extends MPJBaseServiceImpl<InspectMapper, Inspec
inspectVO.setFormList(inspectId2FormIdMap.getOrDefault(inspectVO.getId(), ListUtil.empty())); inspectVO.setFormList(inspectId2FormIdMap.getOrDefault(inspectVO.getId(), ListUtil.empty()));
}); });
}); });
Opt.ofEmptyAble(inspectVOPage.getRecords())
.map(l -> l.stream().map(InspectVO::getId).collect(Collectors.toList()))
.map(idList -> fileService.lambdaQuery().in(FileInfo::getSourceId, idList).eq(FileInfo::getSourceType, 4).list())
.filter(CollUtil::isNotEmpty)
.ifPresent(fileList -> {
Map<Long, Long> id2CntMap = fileList.stream().collect(Collectors.groupingBy(FileInfo::getSourceId
, Collectors.counting()));
inspectVOPage.getRecords().forEach(inspectVO -> {
inspectVO.setFileCount(id2CntMap.getOrDefault(inspectVO.getId(), 0L).intValue());
});
});
return inspectVOPage; return inspectVOPage;
} }
......
package vion.service.impl;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import vion.model.RStoreConfederate;
import vion.mapper.RStoreConfederateMapper;
import vion.service.IRStoreConfederateService;
@Service
public class RStoreConfederateServiceImpl extends ServiceImpl<RStoreConfederateMapper, RStoreConfederate> implements IRStoreConfederateService {
}
package vion.service.impl; package vion.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import org.dromara.hutool.core.array.ArrayUtil; import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.date.DateUtil; import org.dromara.hutool.core.date.DateUtil;
import org.dromara.hutool.core.io.file.FileNameUtil; import org.dromara.hutool.core.io.file.FileNameUtil;
...@@ -14,6 +15,7 @@ import com.github.yulichang.base.MPJBaseServiceImpl; ...@@ -14,6 +15,7 @@ import com.github.yulichang.base.MPJBaseServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.github.linpeilie.Converter; import io.github.linpeilie.Converter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.hutool.json.JSONUtil;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import vion.dto.RepairRecDTO; import vion.dto.RepairRecDTO;
...@@ -21,7 +23,9 @@ import vion.mapper.RepairRecMapper; ...@@ -21,7 +23,9 @@ import vion.mapper.RepairRecMapper;
import vion.model.*; import vion.model.*;
import vion.service.IFileService; import vion.service.IFileService;
import vion.service.IRepairRecService; import vion.service.IRepairRecService;
import vion.third.DingMod;
import vion.vo.RepairRecVO; import vion.vo.RepairRecVO;
import vion.vo.UserVO;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
...@@ -38,6 +42,7 @@ import java.util.List; ...@@ -38,6 +42,7 @@ import java.util.List;
public class RepairRecServiceImpl extends MPJBaseServiceImpl<RepairRecMapper, RepairRec> implements IRepairRecService { public class RepairRecServiceImpl extends MPJBaseServiceImpl<RepairRecMapper, RepairRec> implements IRepairRecService {
private final IFileService fileService; private final IFileService fileService;
private final DingMod dingMod;
private final Converter converter; private final Converter converter;
@Value("${fileUrl:}") @Value("${fileUrl:}")
...@@ -47,39 +52,9 @@ public class RepairRecServiceImpl extends MPJBaseServiceImpl<RepairRecMapper, Re ...@@ -47,39 +52,9 @@ public class RepairRecServiceImpl extends MPJBaseServiceImpl<RepairRecMapper, Re
public Object frontSubmit(RepairRecDTO dto) { public Object frontSubmit(RepairRecDTO dto) {
dto.setUuid(IdUtil.nanoId()); dto.setUuid(IdUtil.nanoId());
RepairRec repairRec = converter.convert(dto, RepairRec.class); RepairRec repairRec = converter.convert(dto, RepairRec.class);
if (this.save(repairRec)) { return this.save(repairRec) ? MapUtil.<String, Long>builder()
Opt.ofNullable(dto.getFiles())
.ifPresent(fileList ->
Arrays.stream(fileList).forEach(infile -> {
//上传url地址
String orgName = infile.getOriginalFilename();
String mainName = FileNameUtil.mainName(orgName);
String fileExt = FileNameUtil.extName(orgName);
String filename = StrUtil.format("{}_{}.{}", mainName, DateUtil.format(new Date(), "yyyyMMdd_HHmmssSSS"), fileExt);
String path = fileUrl + FileUtil.FILE_SEPARATOR + "repairRec" + FileUtil.FILE_SEPARATOR + repairRec.getId() + FileUtil.FILE_SEPARATOR + filename;
File file = FileUtil.touch(path);
try {
infile.transferTo(file);
} catch (IOException e) {
log.error("保存文件出错", e);
}
FileInfo fileInfo = new FileInfo();
fileInfo.setStoreId(-1L);
fileInfo.setSourceId(repairRec.getId());
fileInfo.setSourceType(23);
fileInfo.setName(filename);
fileInfo.setUrl(path);
fileInfo.setType(fileExt);
fileInfo.setSha256(SecureUtil.sha256(file).toUpperCase());
fileInfo.setUploader(repairRec.getContact());
fileService.save(fileInfo);
}));
return MapUtil.<String, Long>builder()
.put("id", repairRec.getId()) .put("id", repairRec.getId())
.build(); .build() : "提交失败";
}
return "提交失败";
} }
@Override @Override
...@@ -113,6 +88,66 @@ public class RepairRecServiceImpl extends MPJBaseServiceImpl<RepairRecMapper, Re ...@@ -113,6 +88,66 @@ public class RepairRecServiceImpl extends MPJBaseServiceImpl<RepairRecMapper, Re
@Override @Override
public String updById(Long id, RepairRecDTO dto) { public String updById(Long id, RepairRecDTO dto) {
return this.updateById(converter.convert(dto, RepairRec.class)) ? "更新成功" : "更新失败"; if (this.updateById(converter.convert(dto, RepairRec.class))) {
UserVO user = (UserVO) StpUtil.getTokenSession().get("curLoginUser");
Opt.ofNullable(dto.getFiles())
.ifPresent(fileList ->
Arrays.stream(fileList).forEach(infile -> {
//上传url地址
String orgName = infile.getOriginalFilename();
String mainName = FileNameUtil.mainName(orgName);
String fileExt = FileNameUtil.extName(orgName);
String filename = StrUtil.format("{}_{}.{}", mainName, DateUtil.format(new Date(), "yyyyMMdd_HHmmssSSS"), fileExt);
String path =
fileUrl + FileUtil.FILE_SEPARATOR + "repairRec" + FileUtil.FILE_SEPARATOR + id + FileUtil.FILE_SEPARATOR + filename;
File file = FileUtil.touch(path);
try {
infile.transferTo(file);
} catch (IOException e) {
log.error("保存文件出错", e);
}
FileInfo fileInfo = new FileInfo();
fileInfo.setStoreId(-1L);
fileInfo.setSourceId(id);
fileInfo.setSourceType(23);
fileInfo.setName(filename);
fileInfo.setUrl(path);
fileInfo.setType(fileExt);
fileInfo.setSha256(SecureUtil.sha256(file).toUpperCase());
fileInfo.setUploader(user.getUsername());
fileService.save(fileInfo);
}));
return "更新成功";
}
return "更新失败";
}
@Override
public Boolean notify(Long id, String userid) {
var repairRec = this.getById(id);
var jsonObj = JSONUtil.ofObj()
.set("agent_id", 2358374016L)
.set("userid_list", userid);
var msg = JSONUtil.ofObj();
var content = JSONUtil.ofObj().set("title", "备件已发货");
String text = StrUtil.format("""
### 返修设备已发货
### 项目名称:{}
### 快递单号:{}
### 发货日期:{}
### 发送时间:{}
""", repairRec.getProjectName(), Opt.ofBlankAble(repairRec.getTrackingNumber()).orElse("暂无"),
Opt.ofBlankAble(DateUtil.formatDate(repairRec.getShipDate())).orElse("暂无"), DateUtil.now());
content.set("text", text);
msg.set("msgtype", "markdown").set("markdown", content);
jsonObj.set("msg", msg);
var pushRes = dingMod.workMsg(jsonObj);
return StrUtil.containsIgnoreCase(pushRes, "ok");
} }
} }
package vion.service.impl; package vion.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.github.linpeilie.Converter;
import lombok.RequiredArgsConstructor;
import org.dromara.hutool.core.array.ArrayUtil; import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.data.id.IdUtil;
import org.dromara.hutool.core.date.DateUtil; import org.dromara.hutool.core.date.DateUtil;
import org.dromara.hutool.core.io.file.FileNameUtil; import org.dromara.hutool.core.io.file.FileNameUtil;
import org.dromara.hutool.core.io.file.FileUtil; import org.dromara.hutool.core.io.file.FileUtil;
import org.dromara.hutool.core.lang.Opt; import org.dromara.hutool.core.lang.Opt;
import org.dromara.hutool.core.map.MapUtil; import org.dromara.hutool.core.map.MapUtil;
import org.dromara.hutool.core.data.id.IdUtil;
import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.hutool.crypto.SecureUtil; import org.dromara.hutool.crypto.SecureUtil;
import com.github.yulichang.base.MPJBaseServiceImpl; import org.dromara.hutool.json.JSONUtil;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.github.linpeilie.Converter;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import vion.dto.SparePartDTO; import vion.dto.SparePartDTO;
...@@ -21,7 +23,9 @@ import vion.mapper.SparePartMapper; ...@@ -21,7 +23,9 @@ import vion.mapper.SparePartMapper;
import vion.model.*; import vion.model.*;
import vion.service.IFileService; import vion.service.IFileService;
import vion.service.ISparePartService; import vion.service.ISparePartService;
import vion.third.DingMod;
import vion.vo.SparePartVO; import vion.vo.SparePartVO;
import vion.vo.UserVO;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
...@@ -38,6 +42,7 @@ import java.util.List; ...@@ -38,6 +42,7 @@ import java.util.List;
public class SparePartServiceImpl extends MPJBaseServiceImpl<SparePartMapper, SparePart> implements ISparePartService { public class SparePartServiceImpl extends MPJBaseServiceImpl<SparePartMapper, SparePart> implements ISparePartService {
private final IFileService fileService; private final IFileService fileService;
private final DingMod dingMod;
private final Converter converter; private final Converter converter;
@Value("${fileUrl:}") @Value("${fileUrl:}")
...@@ -47,7 +52,40 @@ public class SparePartServiceImpl extends MPJBaseServiceImpl<SparePartMapper, Sp ...@@ -47,7 +52,40 @@ public class SparePartServiceImpl extends MPJBaseServiceImpl<SparePartMapper, Sp
public Object frontSubmit(SparePartDTO dto) { public Object frontSubmit(SparePartDTO dto) {
dto.setUuid(IdUtil.nanoId()); dto.setUuid(IdUtil.nanoId());
SparePart sparePart = converter.convert(dto, SparePart.class); SparePart sparePart = converter.convert(dto, SparePart.class);
if (this.save(sparePart)) { return this.save(sparePart) ? MapUtil.<String, Long>builder()
.put("id", sparePart.getId())
.build() : "提交失败";
}
@Override
public List<SparePartVO> list(SparePartDTO dto) {
MPJLambdaWrapper<SparePart> wrapper = new MPJLambdaWrapper<>(converter.convert(dto, SparePart.class))
.selectAll(SparePart.class)
.selectAs(Contract::getName, SparePartVO::getContractName)
.selectCollection(RRepairDevice.class, SparePartVO::getRepairDeviceList)
.leftJoin(Contract.class, Contract::getId, SparePart::getContractId)
.leftJoin(RRepairDevice.class, on -> on.eq(RRepairDevice::getRId, SparePart::getId).eq(RRepairDevice::getRType, 1))
.between(SparePart::getCreateTime, dto.getCreateTimeStart(), dto.getCreateTimeEnd())
.between(ArrayUtil.isAllNotNull(dto.getShipDateStart(), dto.getShipDateEnd()), SparePart::getShipDate, dto.getShipDateStart(), dto.getShipDateEnd())
.orderByDesc(SparePart::getCreateTime);
return this.selectJoinList(SparePartVO.class, wrapper);
}
@Override
public SparePartVO getSparePartDetail(Long id, String uuid) {
MPJLambdaWrapper<SparePart> wrapper = new MPJLambdaWrapper<SparePart>()
.selectAll(SparePart.class)
.eq(ObjUtil.isNotEmpty(id), SparePart::getId, id)
.eq(StrUtil.isNotBlank(uuid), SparePart::getUuid, uuid)
.orderByDesc(PointInfo::getCreateTime);
return this.selectJoinOne(SparePartVO.class, wrapper);
}
@Override
public String updById(Long id, SparePartDTO dto) {
if (this.updateById(converter.convert(dto, SparePart.class))) {
UserVO user = (UserVO) StpUtil.getTokenSession().get("curLoginUser");
Opt.ofNullable(dto.getFiles()) Opt.ofNullable(dto.getFiles())
.ifPresent(fileList -> .ifPresent(fileList ->
Arrays.stream(fileList).forEach(infile -> { Arrays.stream(fileList).forEach(infile -> {
...@@ -56,7 +94,7 @@ public class SparePartServiceImpl extends MPJBaseServiceImpl<SparePartMapper, Sp ...@@ -56,7 +94,7 @@ public class SparePartServiceImpl extends MPJBaseServiceImpl<SparePartMapper, Sp
String mainName = FileNameUtil.mainName(orgName); String mainName = FileNameUtil.mainName(orgName);
String fileExt = FileNameUtil.extName(orgName); String fileExt = FileNameUtil.extName(orgName);
String filename = StrUtil.format("{}_{}.{}", mainName, DateUtil.format(new Date(), "yyyyMMdd_HHmmssSSS"), fileExt); String filename = StrUtil.format("{}_{}.{}", mainName, DateUtil.format(new Date(), "yyyyMMdd_HHmmssSSS"), fileExt);
String path = fileUrl + FileUtil.FILE_SEPARATOR + "sparePart" + FileUtil.FILE_SEPARATOR + sparePart.getId() + FileUtil.FILE_SEPARATOR + filename; String path = fileUrl + FileUtil.FILE_SEPARATOR + "sparePart" + FileUtil.FILE_SEPARATOR + id + FileUtil.FILE_SEPARATOR + filename;
File file = FileUtil.touch(path); File file = FileUtil.touch(path);
try { try {
infile.transferTo(file); infile.transferTo(file);
...@@ -66,49 +104,45 @@ public class SparePartServiceImpl extends MPJBaseServiceImpl<SparePartMapper, Sp ...@@ -66,49 +104,45 @@ public class SparePartServiceImpl extends MPJBaseServiceImpl<SparePartMapper, Sp
FileInfo fileInfo = new FileInfo(); FileInfo fileInfo = new FileInfo();
fileInfo.setStoreId(-1L); fileInfo.setStoreId(-1L);
fileInfo.setSourceId(sparePart.getId()); fileInfo.setSourceId(id);
fileInfo.setSourceType(22); fileInfo.setSourceType(22);
fileInfo.setName(filename); fileInfo.setName(filename);
fileInfo.setUrl(path); fileInfo.setUrl(path);
fileInfo.setType(fileExt); fileInfo.setType(fileExt);
fileInfo.setSha256(SecureUtil.sha256(file).toUpperCase()); fileInfo.setSha256(SecureUtil.sha256(file).toUpperCase());
fileInfo.setUploader(sparePart.getContact()); fileInfo.setUploader(user.getUsername());
fileService.save(fileInfo); fileService.save(fileInfo);
})); }));
return "更新成功";
return MapUtil.<String, Long>builder()
.put("id", sparePart.getId())
.build();
} }
return "提交失败"; return "更新失败";
} }
@Override @Override
public List<SparePartVO> list(SparePartDTO dto) { public Boolean notify(Long id, String userid) {
MPJLambdaWrapper<SparePart> wrapper = new MPJLambdaWrapper<>(converter.convert(dto, SparePart.class)) var sparePart = this.getById(id);
.selectAll(SparePart.class)
.selectAs(Contract::getName, SparePartVO::getContractName)
.selectCollection(RRepairDevice.class, SparePartVO::getRepairDeviceList)
.leftJoin(Contract.class, Contract::getId, SparePart::getContractId)
.leftJoin(RRepairDevice.class, on -> on.eq(RRepairDevice::getRId, SparePart::getId).eq(RRepairDevice::getRType, 1))
.between(SparePart::getCreateTime, dto.getCreateTimeStart(), dto.getCreateTimeEnd())
.between(ArrayUtil.isAllNotNull(dto.getShipDateStart(), dto.getShipDateEnd()), SparePart::getShipDate, dto.getShipDateStart(), dto.getShipDateEnd())
.orderByDesc(SparePart::getCreateTime);
return this.selectJoinList(SparePartVO.class, wrapper);
}
@Override var jsonObj = JSONUtil.ofObj()
public SparePartVO getSparePartDetail(Long id, String uuid) { .set("agent_id", 2358374016L)
MPJLambdaWrapper<SparePart> wrapper = new MPJLambdaWrapper<SparePart>() .set("userid_list", userid);
.selectAll(PointInfo.class)
.eq(ObjUtil.isNotEmpty(id), SparePart::getId, id)
.eq(StrUtil.isNotBlank(uuid), SparePart::getUuid, uuid)
.orderByDesc(PointInfo::getCreateTime);
return this.selectJoinOne(SparePartVO.class, wrapper);
}
@Override var msg = JSONUtil.ofObj();
public String updById(Long id, SparePartDTO dto) { var content = JSONUtil.ofObj().set("title", "备件已发货");
return this.updateById(converter.convert(dto, SparePart.class)) ? "更新成功" : "更新失败"; String text = StrUtil.format("""
### 备件已发货
### 项目名称:{}
### 快递单号:{}
### 发货日期:{}
### 发送时间:{}
""", sparePart.getProjectName(), Opt.ofBlankAble(sparePart.getTrackingNumber()).orElse("暂无"),
Opt.ofBlankAble(DateUtil.formatDate(sparePart.getShipDate())).orElse("暂无"), DateUtil.now());
content.set("text", text);
msg.set("msgtype", "markdown").set("markdown", content);
jsonObj.set("msg", msg);
var pushRes = dingMod.workMsg(jsonObj);
return StrUtil.containsIgnoreCase(pushRes, "ok");
} }
} }
...@@ -116,7 +116,7 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp ...@@ -116,7 +116,7 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp
.map(l -> fileService.lambdaQuery() .map(l -> fileService.lambdaQuery()
.in(FileInfo::getSourceId, l) .in(FileInfo::getSourceId, l)
.in(FileInfo::getStoreId, l) .in(FileInfo::getStoreId, l)
.in(FileInfo::getSourceType, 1, 24, 25, 26, 27) .in(FileInfo::getSourceType, 1, 24, 25, 26, 27, 28)
.list()) .list())
.map(fileList -> fileList.stream().collect(Collectors.groupingBy(FileInfo::getStoreId, Collectors.counting()))) .map(fileList -> fileList.stream().collect(Collectors.groupingBy(FileInfo::getStoreId, Collectors.counting())))
.orElse(MapUtil.empty()); .orElse(MapUtil.empty());
...@@ -345,7 +345,7 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp ...@@ -345,7 +345,7 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp
@Override @Override
public List<StoreVO> storeScreen() { public List<StoreVO> storeScreen() {
MPJLambdaWrapper<Store> wrapper = new MPJLambdaWrapper<Store>() MPJLambdaWrapper<Store> wrapper = new MPJLambdaWrapper<Store>()
.select(Store::getId, Store::getName, Store::getTaskDetail, Store::getFinishDate, Store::getPercentage, Store::getStuckPoint, Store::getIsImportant) .select(Store::getId, Store::getName, Store::getTaskDetail, Store::getPlanFinishDate, Store::getPercentage, Store::getStuckPoint, Store::getIsImportant)
.selectCollection(User.class, StoreVO::getUserNameList, map -> map.result(User::getUsername)) .selectCollection(User.class, StoreVO::getUserNameList, map -> map.result(User::getUsername))
.leftJoin(RStoreUser.class, on -> on.eq(RStoreUser::getStoreId, Store::getId).eq(RStoreUser::getIsMain, 1)) .leftJoin(RStoreUser.class, on -> on.eq(RStoreUser::getStoreId, Store::getId).eq(RStoreUser::getIsMain, 1))
.leftJoin(User.class, User::getId, RStoreUser::getUserId) .leftJoin(User.class, User::getId, RStoreUser::getUserId)
...@@ -377,9 +377,10 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp ...@@ -377,9 +377,10 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp
}); });
// 工单相关合并 // 工单相关合并
taskMapper.update(new Task(), Wrappers.lambdaUpdate(Task.class).set(Task::getStoreId, sourceId).eq(Task::getStoreId, targetId)); taskMapper.update(new Task(), Wrappers.lambdaUpdate(Task.class).set(Task::getStoreId, sourceId).set(Task::getAccountId, store.getAccountId()).eq(Task::getStoreId, targetId));
taskTempService.lambdaUpdate().set(TaskTemp::getStoreId, sourceId).eq(TaskTemp::getStoreId, targetId).update(); taskTempService.lambdaUpdate().set(TaskTemp::getStoreId, sourceId).eq(TaskTemp::getStoreId, targetId).update();
fileService.lambdaUpdate().set(FileInfo::getStoreId, sourceId).eq(FileInfo::getStoreId, targetId).eq(FileInfo::getSourceType, 3).update(); // 所有 targetId 的文件 转移到 sourceId
fileService.lambdaUpdate().set(FileInfo::getStoreId, sourceId).eq(FileInfo::getStoreId, targetId).update();
faultLogService.lambdaUpdate().set(FaultLog::getStoreId, sourceId).eq(FaultLog::getStoreId, targetId).update(); faultLogService.lambdaUpdate().set(FaultLog::getStoreId, sourceId).eq(FaultLog::getStoreId, targetId).update();
formService.lambdaUpdate().set(Form::getStoreId, sourceId).set(Form::getAccountId, store.getAccountId()).eq(Form::getStoreId, targetId).update(new Form()); formService.lambdaUpdate().set(Form::getStoreId, sourceId).set(Form::getAccountId, store.getAccountId()).eq(Form::getStoreId, targetId).update(new Form());
inspectService.lambdaUpdate().set(Inspect::getStoreId, sourceId).set(Inspect::getAccountId, store.getAccountId()).eq(Inspect::getStoreId, targetId).update(new Inspect()); inspectService.lambdaUpdate().set(Inspect::getStoreId, sourceId).set(Inspect::getAccountId, store.getAccountId()).eq(Inspect::getStoreId, targetId).update(new Inspect());
...@@ -426,7 +427,7 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp ...@@ -426,7 +427,7 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp
} }
@Override @Override
public boolean logNotify(Long id, String[] userIdStr) { public Boolean logNotify(Long id, String[] userIdStr) {
MPJLambdaWrapper<Store> wrapper = new MPJLambdaWrapper<Store>() MPJLambdaWrapper<Store> wrapper = new MPJLambdaWrapper<Store>()
.select(Store::getName, Store::getBotToken) .select(Store::getName, Store::getBotToken)
.selectCollection(StoreLog.class, StoreVO::getStoreLog) .selectCollection(StoreLog.class, StoreVO::getStoreLog)
...@@ -474,7 +475,6 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp ...@@ -474,7 +475,6 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp
.set("msgtype", "markdown") .set("msgtype", "markdown")
.set("markdown", markdown) .set("markdown", markdown)
.setOpt("at", atObj); .setOpt("at", atObj);
System.out.println(body);
var pushRes = dingMod.robotPush(storeVO.getBotToken(), body.toString()); var pushRes = dingMod.robotPush(storeVO.getBotToken(), body.toString());
return StrUtil.containsIgnoreCase(pushRes, "ok"); return StrUtil.containsIgnoreCase(pushRes, "ok");
} }
...@@ -531,7 +531,7 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp ...@@ -531,7 +531,7 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp
@Override @Override
public Map<Integer, Long> statState() { public Map<Integer, Long> statState() {
var storeList = this.lambdaQuery().eq(Store::getProjectState, 1).list(); var storeList = this.lambdaQuery().eq(Store::getProjectState, 2).list();
return storeList.stream().collect(Collectors.groupingBy(Store::getProjectStage, Collectors.counting())); return storeList.stream().collect(Collectors.groupingBy(Store::getProjectStage, Collectors.counting()));
} }
......
...@@ -431,12 +431,12 @@ public class TaskServiceImpl extends MPJBaseServiceImpl<TaskMapper, Task> implem ...@@ -431,12 +431,12 @@ public class TaskServiceImpl extends MPJBaseServiceImpl<TaskMapper, Task> implem
} }
@Override @Override
public List<Map<String, Object>> peopleAnalysis(Date startDate, Date endDate, Integer source, Long userId) { public List<Map<String, Object>> peopleAnalysis(Date startDate, Date endDate, Integer source, Long[] userIds) {
List<Task> taskList = this.lambdaQuery() List<Task> taskList = this.lambdaQuery()
.between(ArrayUtil.isAllNotNull(startDate, endDate), Task::getRepairTime, startDate, endDate) .between(ArrayUtil.isAllNotNull(startDate, endDate), Task::getRepairTime, startDate, endDate)
.isNotNull(ObjUtil.equals(source, 1), Task::getTaskTempId) .isNotNull(ObjUtil.equals(source, 1), Task::getTaskTempId)
.isNull(ObjUtil.equals(source, 2), Task::getTaskTempId) .isNull(ObjUtil.equals(source, 2), Task::getTaskTempId)
.eq(ObjUtil.isNotNull(userId), Task::getActiveUser, userId) .in(ArrayUtil.isNotEmpty(userIds), Task::getActiveUser, userIds)
.list(); .list();
List<Store> storeList = storeService.list(); List<Store> storeList = storeService.list();
Map<Long, String> id2UsernameMap = userService.list().stream().collect(Collectors.toMap(User::getId, User::getUsername)); Map<Long, String> id2UsernameMap = userService.list().stream().collect(Collectors.toMap(User::getId, User::getUsername));
...@@ -469,11 +469,12 @@ public class TaskServiceImpl extends MPJBaseServiceImpl<TaskMapper, Task> implem ...@@ -469,11 +469,12 @@ public class TaskServiceImpl extends MPJBaseServiceImpl<TaskMapper, Task> implem
} }
@Override @Override
public List<Map<String, Object>> proAnalysis(Date startDate, Date endDate, Integer source) { public List<Map<String, Object>> proAnalysis(Date startDate, Date endDate, Integer source, Long[] userIds) {
List<Task> taskList = this.lambdaQuery() List<Task> taskList = this.lambdaQuery()
.between(ArrayUtil.isAllNotNull(startDate, endDate), Task::getRepairTime, startDate, endDate) .between(ArrayUtil.isAllNotNull(startDate, endDate), Task::getRepairTime, startDate, endDate)
.isNotNull(ObjUtil.equals(source, 1), Task::getTaskTempId) .isNotNull(ObjUtil.equals(source, 1), Task::getTaskTempId)
.isNull(ObjUtil.equals(source, 2), Task::getTaskTempId) .isNull(ObjUtil.equals(source, 2), Task::getTaskTempId)
.in(ArrayUtil.isNotEmpty(userIds), Task::getActiveUser, userIds)
.list(); .list();
List<Store> storeList = storeService.list(); List<Store> storeList = storeService.list();
Map<Long, String> id2UsernameMap = userService.list().stream().collect(Collectors.toMap(User::getId, User::getUsername)); Map<Long, String> id2UsernameMap = userService.list().stream().collect(Collectors.toMap(User::getId, User::getUsername));
......
...@@ -241,10 +241,13 @@ public class DingMod { ...@@ -241,10 +241,13 @@ public class DingMod {
UserVO userVO = converter.convert(user, UserVO.class); UserVO userVO = converter.convert(user, UserVO.class);
// 禁用用户或离职用户禁止登录系统 // 禁用用户或离职用户禁止登录系统
if (userVO.getStatus() == 1 || userVO.getEmployeeStatus() == 5) { if (userVO.getStatus() == 1 || userVO.getEmployeeStatus() == 5) {
return "该用户禁止登录系统,请联系管理员!"; return "用户已禁用禁止登录系统,请联系管理员!";
} }
Long id = userVO.getId(); Long id = userVO.getId();
setRolesAndPerms(id, userVO); setRolesAndPerms(id, userVO);
if (CollUtil.isEmpty(userVO.getRoleVOList())) {
return "用户未分配角色,请联系管理员!";
}
StpUtil.login(id); StpUtil.login(id);
String token = StpUtil.getTokenValue(); String token = StpUtil.getTokenValue();
...@@ -273,6 +276,9 @@ public class DingMod { ...@@ -273,6 +276,9 @@ public class DingMod {
Long id = userVO.getId(); Long id = userVO.getId();
setRolesAndPerms(id, userVO); setRolesAndPerms(id, userVO);
if (CollUtil.isEmpty(userVO.getRoleVOList())) {
return "用户未分配角色,请联系管理员!";
}
StpUtil.login(id); StpUtil.login(id);
String token = StpUtil.getTokenValue(); String token = StpUtil.getTokenValue();
...@@ -301,6 +307,50 @@ public class DingMod { ...@@ -301,6 +307,50 @@ public class DingMod {
return "钉钉回调异常,请联系相关人员"; return "钉钉回调异常,请联系相关人员";
} }
/**
* 钉钉工作台应用获取应用程序token
*
* @param authCode 授权码
* @return java.lang.Object
*/
public Object getPlatformToken(String authCode) {
var accessTokenStr = HttpUtil.get(StrUtil.format("https://oapi.dingtalk.com/gettoken?appkey={}&appsecret={}",
appKey, appSecret));
if (!StrUtil.contains(accessTokenStr, "access_token")) {
log.error("获取钉钉access_token失败:{}", accessTokenStr);
return "获取钉钉access_token失败";
}
var accessToken = JSONUtil.parseObj(accessTokenStr).getStr("access_token");
var userInfoStr = HttpUtil.post("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo?access_token=" + accessToken,
JSONUtil.ofObj().set("code", authCode));
if (!StrUtil.contains(userInfoStr, "\"errmsg\":\"ok\"")) {
log.error("获取钉钉用户信息失败:{}", userInfoStr);
return "获取钉钉用户信息失败";
}
var userid = JSONUtil.parseObj(userInfoStr).getJSONObject("result").getStr("userid");
User user = userService.lambdaQuery()
.select(User::getId, User::getUserid, User::getUsername, User::getPhone, User::getStatus, User::getEmployeeStatus)
.eq(User::getUserid, userid).one();
UserVO userVO = converter.convert(user, UserVO.class);
// 禁用用户或离职用户禁止登录系统
if (userVO.getStatus() == 1 || userVO.getEmployeeStatus() == 5) {
return "用户已禁用禁止登录系统,请联系管理员!";
}
Long id = userVO.getId();
setRolesAndPerms(id, userVO);
if (CollUtil.isEmpty(userVO.getRoleVOList())) {
return "用户未分配角色,请联系管理员!";
}
StpUtil.login(id);
String token = StpUtil.getTokenValue();
userVO.setToken(token);
StpUtil.getTokenSession().set("curLoginUser", userVO);
return userVO;
}
private void setRolesAndPerms(Long id, UserVO userVO) { private void setRolesAndPerms(Long id, UserVO userVO) {
List<RUserRole> userRoleList = userRoleService.lambdaQuery().eq(RUserRole::getUserId, id).list(); List<RUserRole> userRoleList = userRoleService.lambdaQuery().eq(RUserRole::getUserId, id).list();
List<RRoleResource> roleResourceList = Opt.ofEmptyAble(userRoleList) List<RRoleResource> roleResourceList = Opt.ofEmptyAble(userRoleList)
......
package vion.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
@Getter
@Setter
public class DeliverLogVO {
private Long id;
/**
* 集团id
*/
private Long accountId;
/**
* 项目id
*/
private Long storeId;
private String storeName;
/**
* 合同编号
*/
private String contractNo;
private String contractSaleName;
/**
* 日志人
*/
private Long userId;
private String userName;
/**
* 日志日期
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date logDate;
/**
* 干系人
*/
private Long confederateId;
private String confederateName;
/**
* 服务方式
*/
private Integer serviceType;
/**
* 耗时
*/
private Double logHour;
/**
* 工作内容
*/
private String content;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 修改时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
}
\ No newline at end of file \ No newline at end of file
...@@ -51,4 +51,5 @@ public class InspectVO { ...@@ -51,4 +51,5 @@ public class InspectVO {
private String accountName; private String accountName;
private String storeName; private String storeName;
private List<FormVO> formList; private List<FormVO> formList;
private Integer fileCount;
} }
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!