提交 42a4bcf1 authored 作者: 许俊's avatar 许俊

加锁

上级 eef8e5f0
......@@ -37,13 +37,13 @@ public class Result<T> implements Serializable {
*/
@ApiModelProperty(value = "返回代码")
private String code ;
/**
* 返回数据对象 data
*/
@ApiModelProperty(value = "返回数据对象")
private T result;
/**
* 时间戳
*/
......@@ -51,9 +51,9 @@ public class Result<T> implements Serializable {
private long timestamp = System.currentTimeMillis();
public Result() {
}
public Result<T> success(String message) {
this.message = message;
this.code = CommonConstant.SC_OK_200.toString();
......@@ -129,11 +129,11 @@ public class Result<T> implements Serializable {
r.setResult(data);
return r;
}
public static Result<Object> error(String msg) {
return error(CommonConstant.SC_INTERNAL_SERVER_ERROR_500.toString(), msg);
}
public static Result<Object> error(String code, String msg) {
Result<Object> r = new Result<Object>();
r.setCode(code);
......
package org.jeecg.common.util;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStringCommands;
import org.springframework.data.redis.connection.ReturnType;
import org.springframework.data.redis.core.RedisConnectionUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.types.Expiration;
import org.springframework.stereotype.Repository;
import java.nio.charset.Charset;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@Repository
public class RedisLock {
/**
* 解锁脚本,原子操作
*/
private static final String unlockScript =
"if redis.call(\"get\",KEYS[1]) == ARGV[1]\n"
+ "then\n"
+ " return redis.call(\"del\",KEYS[1])\n"
+ "else\n"
+ " return 0\n"
+ "end";
private StringRedisTemplate redisTemplate;
public RedisLock(StringRedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
/**
* 加锁,有阻塞
* @param name
* @param expire
* @param timeout
* @return
*/
public String lock(String name, long expire, long timeout){
long startTime = System.currentTimeMillis();
String token;
do{
token = tryLock(name, expire);
if(token == null) {
if((System.currentTimeMillis()-startTime) > (timeout-50))
break;
try {
Thread.sleep(50); //try 50 per sec
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
}while(token==null);
return token;
}
/**
* 加锁,无阻塞
* @param name
* @param expire
* @return
*/
public String tryLock(String name, long expire) {
String token = UUID.randomUUID().toString();
RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
RedisConnection conn = factory.getConnection();
try{
Boolean result = conn.set(name.getBytes(Charset.forName("UTF-8")), token.getBytes(Charset.forName("UTF-8")),
Expiration.from(expire, TimeUnit.MILLISECONDS), RedisStringCommands.SetOption.SET_IF_ABSENT);
if(result!=null && result)
return token;
}finally {
RedisConnectionUtils.releaseConnection(conn, factory);
}
return null;
}
/**
* 解锁
* @param name
* @param token
* @return
*/
public boolean unlock(String name, String token) {
byte[][] keysAndArgs = new byte[2][];
keysAndArgs[0] = name.getBytes(Charset.forName("UTF-8"));
keysAndArgs[1] = token.getBytes(Charset.forName("UTF-8"));
RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
RedisConnection conn = factory.getConnection();
try {
Long result = (Long)conn.scriptingCommands().eval(unlockScript.getBytes(Charset.forName("UTF-8")), ReturnType.INTEGER, 1, keysAndArgs);
if(result!=null && result>0)
return true;
}finally {
RedisConnectionUtils.releaseConnection(conn, factory);
}
return false;
}
}
\ No newline at end of file
......@@ -25,5 +25,6 @@ public class ThreadLocalConfig {
ThreadLocalConfig.mapThreadLocal.remove();
}
}
package org.jeecg.modules.iost.ims.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.jeecg.modules.iost.ims.entity.ImsAsnReceiveConfirm;
import org.jeecg.modules.iost.ims.service.ImsAsnReceiveConfirmService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.query.QueryGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description: ImsAsnReceiveConfirm ASN收料确认
* @Author: jeecg-boot
* @Date: 2021-12-03
* @Version: V1.0
*/
@Api(tags="ims_asn_receive_confirm")
@RestController
@RequestMapping("/ims-asn-receive-confirm")
public class ImsAsnReceiveConfirmController {
@Autowired
private ImsAsnReceiveConfirmService imsAsnReceiveConfirmService;
@AutoLog(value = "分页列表查询")
@ApiOperation(value="ims_asn_receive_confirm-分页列表查询", notes="ims_asn_receive_confirm-分页列表查询")
@GetMapping(value = "/list")
public Result<?> queryPageList(@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
Page<ImsAsnReceiveConfirm> page = new Page<ImsAsnReceiveConfirm>(pageNo, pageSize);
IPage<ImsAsnReceiveConfirm> pageList = imsAsnReceiveConfirmService.page(page, null);
return Result.OK(pageList);
}
}
......@@ -9,11 +9,13 @@ import kingdee.bos.webapi.client.K3CloudApiClient;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.util.RedisLock;
import org.jeecg.modules.base.service.BaseCommonService;
import org.jeecg.modules.iost.ims.Dao.CategoryDao;
import org.jeecg.modules.iost.ims.Exception.ConnectConstant.KingDeeConstant;
import org.jeecg.modules.iost.ims.Exception.KingdeeConnectException;
import org.jeecg.modules.iost.ims.ExternalInterface.IMSApi;
import org.jeecg.modules.iost.ims.Util.ThreadLocalConfig;
import org.jeecg.modules.iost.ims.entity.ImsInitConnectParm;
import org.jeecg.modules.iost.ims.entity.Vo.ConnectParmVo;
import org.jeecg.modules.iost.ims.entity.Vo.ImsRequestVo;
......@@ -64,6 +66,9 @@ public class WebApi {
@Autowired
IImsInventoryLossService iImsInventoryLossService;
@Autowired
ImsAsnReceiveConfirmService imsAsnReceiveConfirmService;
@Autowired
IImsMiscellaneousIssueService iImsMiscellaneousIssueService;
@Autowired
IImsSupplierReturnsService iImsSupplierReturnsService;
......@@ -73,11 +78,21 @@ public class WebApi {
* @return
* @throws ParseException
*/
@Autowired
RedisLock redisLock;
@AutoLog(value = "IMS通用接口")
@ApiOperation(value = "IMS通用接口", notes = "IMS通用接口")
@PostMapping(value = "/GetData")
public Result<?> GetData(@RequestBody ImsRequest request) throws ParseException {
String token = redisLock.tryLock(request.getCode()+request.getData().get(0).get("QUEUE_ID").toString(), 1000 * 60*2);
if(token==null)
{
return Result.fail("操作失败","请勿提交相同数据!",request.getCode());
}
Map<String,String> map=new HashMap<>();
map.put("key",request.getCode()+request.getData().get(0).get("QUEUE_ID").toString());
map.put("token",token);
ThreadLocalConfig.set(map);
Map<String, String> data = null;
/* //根据识别码调用响应的业务
//采购订单
......@@ -85,14 +100,19 @@ public class WebApi {
data = iImsPoService.getData(request.getData());
//ERP工单
}*/
if (data.containsKey("true") && data.get("true").equals("[]")) {
return Result.fail("操作失败", "对应参数下查询结果为空或参数值类型错误", request.getCode());
//如果有错误信息则返回
} else if (data.containsKey("false")) {
return Result.fail("操作失败", data.get("false"), request.getCode());
try {
if (data.containsKey("true") && data.get("true").equals("[]")) {
return Result.fail("操作失败", "对应参数下查询结果为空或参数值类型错误", request.getCode());
//如果有错误信息则返回
} else if (data.containsKey("false")) {
return Result.fail("操作失败", data.get("false"), request.getCode());
}
return Result.OK(data.get("true"), request.getCode());
}finally {
redisLock.unlock(ThreadLocalConfig.get().get("key").toString(), ThreadLocalConfig.get().get("token").toString());
ThreadLocalConfig.remove();
}
return Result.OK(data.get("true"), request.getCode());
}
......@@ -106,37 +126,53 @@ public class WebApi {
@ApiOperation(value = "第三方通用接口-updateThirdData", notes = "第三方通用接口-updateThirdData")
@PostMapping(value = "/updateThirdData")
public Result<?> updateData(@RequestBody ImsRequestVo request) throws ParseException {
String result = new String();
//根据doctype调用不同的业务service
if (request.getDocType().equals("BS0001"))//采购订单收料
String token = redisLock.tryLock(request.getDocType()+request.getData().get(0).get("QUEUE_ID").toString(), 1000 * 60*2);
if(token==null)
{
result = imsPurchaseOrderService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0002")) { //采购订单收料确认
result = imsPurchaseOrderConfirmService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0004")) { //客供料收料确认
result = imsCustomerSupplyConfirmService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0006")) { //无采购订单收料确认
result = imsNoPurchaseOrderConfirmService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0008")) { //ASN收料
result = imsAsnReceiveService.setData(request.getData(), request.getDocType());
}else if (request.getDocType().equals("BS0026")) { //过程报废收料确认
result = iImsProcessScrapReceiptService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0028")) {//盘盈
result = imsInventorySurplusService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0029")) {//盘亏
result = iImsInventoryLossService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0043")) {//其他出库
result = iImsMiscellaneousIssueService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0045")) {//供应商退货
result = iImsSupplierReturnsService.setData(request.getData(), request.getDocType());
return Result.fail("操作失败","请勿提交相同数据!",request.getDocType());
}
Map<String,String> map=new HashMap<>();
map.put("key",request.getDocType()+request.getData().get(0).get("QUEUE_ID").toString());
map.put("token",token);
ThreadLocalConfig.set(map);
String result = new String();
try {
//根据doctype调用不同的业务service
if (request.getDocType().equals("BS0001"))//采购订单收料
{
result = imsPurchaseOrderService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0002")) { //采购订单收料确认
result = imsPurchaseOrderConfirmService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0004")) { //客供料收料确认
result = imsCustomerSupplyConfirmService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0006")) { //无采购订单收料确认
result = imsNoPurchaseOrderConfirmService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0008")) { //ASN收料
result = imsAsnReceiveService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0009")) {//ASN收料确认
result = imsAsnReceiveConfirmService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0026")) { //过程报废收料确认
result = iImsProcessScrapReceiptService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0028")) {//盘盈
result = imsInventorySurplusService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0029")) {//盘亏
result = iImsInventoryLossService.setData(request.getData(), request.getDocType());
}else if (request.getDocType().equals("BS0043")) {//其他出库
result = iImsMiscellaneousIssueService.setData(request.getData(), request.getDocType());
} else if (request.getDocType().equals("BS0045")) {//供应商退货
result = iImsSupplierReturnsService.setData(request.getData(), request.getDocType());
}
/* }*/
result = result.replace("\n", "");
result = result.replace("\t", "");
result = result.replace("\r", "");
result = result.replace(" ", "");
return Result.OK(result, request.getDocType());
/* }*/
result = result.replace("\n", "");
result = result.replace("\t", "");
result = result.replace("\r", "");
result = result.replace(" ", "");
return Result.OK(result, request.getDocType());
}finally {
redisLock.unlock(ThreadLocalConfig.get().get("key").toString(), ThreadLocalConfig.get().get("token").toString());
ThreadLocalConfig.remove();
}
}
/*List<Map<String,Object>>转换Map<String,Object>*/
......
package org.jeecg.modules.iost.ims.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.baomidou.mybatisplus.annotation.TableName;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @Description: ImsAsnReceiveConfirm ASN收料确认
* @Author: jeecg-boot
* @Date: 2021-12-03
* @Version: V1.0
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("ims_asn_receive_confirm")
@ApiModel(value="ImsAsnReceiveConfirm对象", description="")
public class ImsAsnReceiveConfirm implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
@ApiModelProperty(value = "唯一序号")
private String queueId;
@ApiModelProperty(value = "交易时间")
private Date trxDate;
@ApiModelProperty(value = "操作人编码")
private String userCode;
@ApiModelProperty(value = "组织代码")
private String orgId;
@ApiModelProperty(value = "仓库编码")
private String storeCode;
@ApiModelProperty(value = "供应商编码")
private String supCode;
@ApiModelProperty(value = "采购单号")
private String poCode;
@ApiModelProperty(value = "采购单行号")
private String poSeq;
@ApiModelProperty(value = "物料编码")
private String mtrlCode;
@ApiModelProperty(value = "数量")
private String quantity;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "fid")
private String fid;
@ApiModelProperty(value = "单据编码")
private String fbillNo;
@ApiModelProperty(value = "单据体内码-分录")
private String fentryId;
}
package org.jeecg.modules.iost.ims.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.jeecg.modules.iost.ims.entity.ImsAsnReceiveConfirm;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: ImsAsnReceiveConfirm ASN收料确认
* @Author: jeecg-boot
* @Date: 2021-12-03
* @Version: V1.0
*/
@Mapper
public interface ImsAsnReceiveConfirmMapper extends BaseMapper<ImsAsnReceiveConfirm> {
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.iost.ims.mapper.ImsAsnReceiveConfirmMapper">
</mapper>
package org.jeecg.modules.iost.ims.service;
import org.jeecg.modules.iost.ims.entity.ImsAsnReceiveConfirm;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
/**
* @Description: ImsAsnReceiveConfirm ASN收料确认
* @Author: jeecg-boot
* @Date: 2021-12-03
* @Version: V1.0
*/
public interface ImsAsnReceiveConfirmService extends IService<ImsAsnReceiveConfirm> {
public String setData(List<Map<String,Object>> needLists, String code);
}
......@@ -49,7 +49,7 @@ public class ImsAsnReceiveServiceImpl extends ServiceImpl<ImsAsnReceiveMapper, I
public String setData(List<Map<String,Object>> needLists,String code) {
//追加参数(上下文对象)
String kingdeeLogOZTName = ImsAsnReceiveApi.getKingdeeLogOZTName();
Map<String,String> map2=new HashMap<>();
Map map2 = ThreadLocalConfig.get();
map2.put("KingdeeLogOZTName",kingdeeLogOZTName);
map2.put("SEQ",SEQ);
map2.put("wipOrde",wipOrde);
......@@ -135,7 +135,6 @@ public class ImsAsnReceiveServiceImpl extends ServiceImpl<ImsAsnReceiveMapper, I
}
//保存实体类
this.saveBatch(ImsAsnReceives);
ThreadLocalConfig.remove();
return ImsAsnReceives.get(0).getFbillNo();
}
......
......@@ -42,7 +42,7 @@ public class ImsCustomerSupplyConfirmServiceImpl extends ServiceImpl<ImsCustomer
public String setData(List<Map<String,Object>> needLists,String code) {
//追加参数(上下文对象)
String kingdeeLogOZTName = ImsCustomerSupplyConfirmApi.getKingdeeLogOZTName();
Map<String,String> map2=new HashMap<>();
Map map2 = ThreadLocalConfig.get();
map2.put("KingdeeLogOZTName",kingdeeLogOZTName);
ThreadLocalConfig.set(map2);
......@@ -98,7 +98,7 @@ public class ImsCustomerSupplyConfirmServiceImpl extends ServiceImpl<ImsCustomer
//保存实体类
this.saveBatch(ImsCustomerSupplyConfirms);
ThreadLocalConfig.remove();
return ImsCustomerSupplyConfirms.get(0).getFbillNo();
}
......
......@@ -42,7 +42,7 @@ public class ImsNoPurchaseOrderConfirmServiceImpl extends ServiceImpl<ImsNoPurch
public String setData(List<Map<String,Object>> needLists,String code) {
//追加参数(上下文对象)
String kingdeeLogOZTName = ImsNoPurchaseOrderConfirmApi.getKingdeeLogOZTName();
Map<String,String> map2=new HashMap<>();
Map map2 = ThreadLocalConfig.get();
map2.put("KingdeeLogOZTName",kingdeeLogOZTName);
ThreadLocalConfig.set(map2);
......
......@@ -45,7 +45,7 @@ public class ImsProcessScrapReceiptServiceImpl extends ServiceImpl<ImsProcessScr
public String setData(List<Map<String, Object>> needLists, String code) {
//追加参数(上下文对象)
String kingdeeLogOZTName = imsProcessScrapReceiptApi.getKingdeeLogOZTName();
Map<String,String> map2=new HashMap<>();
Map map2 = ThreadLocalConfig.get();
map2.put("KingdeeLogOZTName",kingdeeLogOZTName);
ThreadLocalConfig.set(map2);
......
......@@ -49,7 +49,7 @@ public class ImsPurchaseOrderConfirmServiceImpl extends ServiceImpl<ImsPurchaseO
public String setData(List<Map<String,Object>> needLists,String code) {
//追加参数(上下文对象)
String kingdeeLogOZTName = imsPurchaseOrderConfirmApi.getKingdeeLogOZTName();
Map<String,String> map2=new HashMap<>();
Map map2 = ThreadLocalConfig.get();
map2.put("KingdeeLogOZTName",kingdeeLogOZTName);
map2.put("SEQ",SEQ);
map2.put("wipOrde",wipOrde);
......@@ -135,7 +135,7 @@ public class ImsPurchaseOrderConfirmServiceImpl extends ServiceImpl<ImsPurchaseO
}
//保存实体类
this.saveBatch(ImsPurchaseOrderConfirms);
ThreadLocalConfig.remove();
return ImsPurchaseOrderConfirms.get(0).getFbillNo();
}
......
......@@ -49,7 +49,7 @@ public class ImsPurchaseOrderServiceImpl extends ServiceImpl<ImsPurchaseOrderMap
public String setData(List<Map<String,Object>> needLists,String code) {
//追加参数(上下文对象)
String kingdeeLogOZTName = ImsPurchaseOrderApi.getKingdeeLogOZTName();
Map<String,String> map2=new HashMap<>();
Map map2 = ThreadLocalConfig.get();
map2.put("KingdeeLogOZTName",kingdeeLogOZTName);
map2.put("SEQ",SEQ);
map2.put("wipOrde",wipOrde);
......@@ -135,7 +135,7 @@ public class ImsPurchaseOrderServiceImpl extends ServiceImpl<ImsPurchaseOrderMap
}
//保存实体类
this.saveBatch(ImsPurchaseOrders);
ThreadLocalConfig.remove();
return ImsPurchaseOrders.get(0).getFbillNo();
}
......
......@@ -46,7 +46,7 @@ public class ImsReturnMaterialDefectiveProductsServiceImpl extends ServiceImpl<I
public String setData(List<Map<String, Object>> needLists, String code) {
//追加参数(上下文对象)
String kingdeeLogOZTName = imsReturnMaterialDefectiveProductsApi.getKingdeeLogOZTName();
Map<String,String> map2=new HashMap<>();
Map map2 = ThreadLocalConfig.get();
map2.put("KingdeeLogOZTName",kingdeeLogOZTName);
map2.put("SEQ",SEQ);
map2.put("wipOrde",wipOrde);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论