first commit
This commit is contained in:
parent
290b081039
commit
54270dd8d4
|
@ -0,0 +1,20 @@
|
||||||
|
package nccloud.openapi;
|
||||||
|
|
||||||
|
|
||||||
|
public class ArriveResourcesTest extends nccloud.openapi.BaseOpenApiTest {
|
||||||
|
public void save() {
|
||||||
|
String url = "/nccloud/api/pu/arrive/saveFromOrder";
|
||||||
|
|
||||||
|
try {
|
||||||
|
String result = requestOpenApiByJSON(url, "resources/Arrive.json");
|
||||||
|
System.out.println(result);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
ArriveResourcesTest test = new ArriveResourcesTest();
|
||||||
|
test.save();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,406 @@
|
||||||
|
package nccloud.openapi;
|
||||||
|
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import nc.ws.opm.pub.utils.security.SecurityUtil;
|
||||||
|
import nccloud.openapi.BaseOpenApiTest.HttpClientWapper.Response;
|
||||||
|
import org.apache.commons.httpclient.Header;
|
||||||
|
import org.apache.commons.httpclient.HttpClient;
|
||||||
|
import org.apache.commons.httpclient.NameValuePair;
|
||||||
|
import org.apache.commons.httpclient.methods.GetMethod;
|
||||||
|
import org.apache.commons.httpclient.methods.PostMethod;
|
||||||
|
import org.apache.commons.httpclient.methods.StringRequestEntity;
|
||||||
|
import org.apache.commons.httpclient.util.EncodingUtil;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.core.io.ClassPathResource;
|
||||||
|
import sun.misc.BASE64Decoder;
|
||||||
|
import sun.misc.BASE64Encoder;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.*;
|
||||||
|
import java.security.spec.X509EncodedKeySpec;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description: 审批流程接口测试
|
||||||
|
* @author:guoxqc@yonyou.com
|
||||||
|
* @date:2020年10月23日
|
||||||
|
*/
|
||||||
|
public class BaseOpenApiTest {
|
||||||
|
// public static final String BASE_URL_DEV="http://192.168.82.5:9999";
|
||||||
|
public static final String BASE_URL_DEV = "http://127.0.0.1:8088";
|
||||||
|
// public static final String BASE_URL_DEV = "http://192.168.82.104:7788";
|
||||||
|
// public static final String BASE_URL_DEV="http://192.168.82.1:9081";
|
||||||
|
// public static final String BASE_URL_DEV="http://172.23.17.146:8001";
|
||||||
|
/**
|
||||||
|
* APP ID
|
||||||
|
*/
|
||||||
|
public static final String CLIENT_ID;
|
||||||
|
/**
|
||||||
|
* APP Secret
|
||||||
|
*/
|
||||||
|
public static final String CLIENT_SECRET;
|
||||||
|
/**
|
||||||
|
* 公钥
|
||||||
|
*/
|
||||||
|
public static final String PUBLIC_KEY;
|
||||||
|
/**
|
||||||
|
* 账套编码
|
||||||
|
*/
|
||||||
|
public static final String BIZ_CENTER;
|
||||||
|
/**
|
||||||
|
* 用户编码
|
||||||
|
*/
|
||||||
|
public static final String USER_CODE;
|
||||||
|
|
||||||
|
static {
|
||||||
|
ResourceBundle config = ResourceBundle.getBundle("nccloud.openapi.config");
|
||||||
|
CLIENT_ID = config.getString("client_id");
|
||||||
|
CLIENT_SECRET = config.getString("client_secret");
|
||||||
|
PUBLIC_KEY = config.getString("pub_key");
|
||||||
|
BIZ_CENTER = config.getString("biz_center");
|
||||||
|
USER_CODE = config.getString("user_code");
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpClientWapper client = new HttpClientWapper();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param url
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public String requestOpenApi(String url, Map<String, Object> param) throws Exception {
|
||||||
|
return requestOpenApi(url, new JSONObject(param));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param url
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public String requestOpenApi(String url, JSONObject param) throws Exception {
|
||||||
|
return requestOpenApi(url, param.toJSONString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param url
|
||||||
|
* @param fileName
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public String requestOpenApiByJSON(String url, String fileName) throws Exception {
|
||||||
|
ClassPathResource classPathResorce = new ClassPathResource(fileName, this.getClass());
|
||||||
|
StringBuffer data = new StringBuffer();
|
||||||
|
try {
|
||||||
|
InputStream in = classPathResorce.getInputStream();
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "utf-8"));
|
||||||
|
String line = reader.readLine();
|
||||||
|
while (StringUtils.isNotEmpty(line)) {
|
||||||
|
data.append(line);
|
||||||
|
line = reader.readLine();
|
||||||
|
}
|
||||||
|
} catch (IOException e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
return requestOpenApi(url, data.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String requestOpenApi(String url, String param) throws Exception {
|
||||||
|
String accessToken = this.getAccessTokenByClient();
|
||||||
|
System.out.println(param.replace(" ", ""));
|
||||||
|
String sign = digest(CLIENT_ID + PUBLIC_KEY);
|
||||||
|
List<Header> headers = new ArrayList<Header>();
|
||||||
|
headers.add(new Header("Content-Type", "application/json;charset=UTF-8"));
|
||||||
|
headers.add(new Header("signature", sign));
|
||||||
|
headers.add(new Header("ucg_flag", "y"));
|
||||||
|
headers.add(new Header("access_token", accessToken));
|
||||||
|
headers.add(new Header("client_id", CLIENT_ID));
|
||||||
|
Response response;
|
||||||
|
try {
|
||||||
|
response = client.post(BASE_URL_DEV + url, headers.toArray(new Header[headers.size()]), null, param);
|
||||||
|
// System.out.println(response.getData());
|
||||||
|
return response.getData();
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
return e.getMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param seed 种子,用于生成公钥
|
||||||
|
* @param src 明文
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
* @description RSA加密
|
||||||
|
*/
|
||||||
|
public String pubEncrypt(String seed, String src) throws Exception {
|
||||||
|
String target = null;
|
||||||
|
ByteArrayOutputStream out = null;
|
||||||
|
try {
|
||||||
|
Key key = genPublicKey(PUBLIC_KEY);
|
||||||
|
Cipher cipher = Cipher.getInstance("RSA");
|
||||||
|
cipher.init(1, key);
|
||||||
|
byte[] data = src.getBytes();
|
||||||
|
int inputLen = data.length;
|
||||||
|
out = new ByteArrayOutputStream();
|
||||||
|
int offSet = 0;
|
||||||
|
int i = 0;
|
||||||
|
while (inputLen - offSet > 0) {
|
||||||
|
byte[] cache;
|
||||||
|
;
|
||||||
|
if (inputLen - offSet > 117) {
|
||||||
|
cache = cipher.doFinal(data, offSet, 117);
|
||||||
|
} else {
|
||||||
|
cache = cipher.doFinal(data, offSet, inputLen - offSet);
|
||||||
|
}
|
||||||
|
out.write(cache, 0, cache.length);
|
||||||
|
i++;
|
||||||
|
offSet = i * 117;
|
||||||
|
}
|
||||||
|
target = new BASE64Encoder().encodeBuffer(out.toByteArray());
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new Exception("加密失败" + e.getMessage());
|
||||||
|
} finally {
|
||||||
|
if (out != null) {
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param str
|
||||||
|
* @return
|
||||||
|
* @description 信息摘要
|
||||||
|
*/
|
||||||
|
public static String digest(String str) {
|
||||||
|
String encodestr = "";
|
||||||
|
try {
|
||||||
|
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
|
||||||
|
messageDigest.update(str.getBytes(StandardCharsets.UTF_8));
|
||||||
|
encodestr = byte2Hex(messageDigest.digest());
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
return encodestr;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String byte2Hex(byte[] bytes) {
|
||||||
|
StringBuffer stringBuffer = new StringBuffer();
|
||||||
|
String temp = null;
|
||||||
|
for (int i = 0; i < bytes.length; i++) {
|
||||||
|
temp = Integer.toHexString(bytes[i] & 0xFF);
|
||||||
|
if (temp.length() == 1) {
|
||||||
|
stringBuffer.append("0");
|
||||||
|
}
|
||||||
|
stringBuffer.append(temp);
|
||||||
|
}
|
||||||
|
return stringBuffer.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param PUBLIC_KEY
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
* @description 根据种子生成密钥对
|
||||||
|
*/
|
||||||
|
public static Key genPublicKey(String seed) throws Exception {
|
||||||
|
Key key = null;
|
||||||
|
try {
|
||||||
|
byte[] keyBytes = new BASE64Decoder().decodeBuffer(seed);
|
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
|
||||||
|
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
|
||||||
|
key = keyFactory.generatePublic(x509KeySpec);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new Exception("无效的密钥 " + e.getMessage());
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Http请求包装类
|
||||||
|
*
|
||||||
|
* @author guoxiangqiao
|
||||||
|
* @date 2019年12月11日
|
||||||
|
*/
|
||||||
|
public class HttpClientWapper {
|
||||||
|
public static final int HTTP_STATUS_SUCCESS = 200;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* post请求
|
||||||
|
*
|
||||||
|
* @param url
|
||||||
|
* @param headers
|
||||||
|
* @param requestBody
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public Response post(String url, Header[] headers, NameValuePair[] requestBody, String requestEntityStr) throws Exception {
|
||||||
|
HttpClient client = new HttpClient();
|
||||||
|
PostMethod postMethod = new PostMethod(url);
|
||||||
|
if (headers != null) {
|
||||||
|
for (Header header : headers) {
|
||||||
|
postMethod.setRequestHeader(header);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (requestBody != null) {
|
||||||
|
postMethod.setRequestBody(requestBody);
|
||||||
|
}
|
||||||
|
if (StringUtils.isNotEmpty(requestEntityStr)) {
|
||||||
|
StringRequestEntity requestEntity = new StringRequestEntity(requestEntityStr, null, "utf-8");
|
||||||
|
postMethod.setRequestEntity(requestEntity);
|
||||||
|
}
|
||||||
|
int httpStatus = client.executeMethod(postMethod);
|
||||||
|
String result = this.getResponseBodyAsString(postMethod);
|
||||||
|
return new Response(httpStatus, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getResponseBodyAsString(PostMethod postMethod) throws IOException {
|
||||||
|
byte[] rawdata = null;
|
||||||
|
rawdata = postMethod.getResponseBody();
|
||||||
|
return rawdata != null ? EncodingUtil.getString(rawdata, "utf-8") : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param params
|
||||||
|
* @return
|
||||||
|
* @description Map转URL参数
|
||||||
|
* @author guoxqc@yonyou.com
|
||||||
|
* @date 2020年10月22日
|
||||||
|
*/
|
||||||
|
public String getURLParam(Map<String, Object> params) {
|
||||||
|
StringBuffer paramStr = new StringBuffer();
|
||||||
|
if (!params.isEmpty()) {
|
||||||
|
for (Entry<String, Object> kv : params.entrySet()) {
|
||||||
|
paramStr.append(kv.getKey());
|
||||||
|
paramStr.append("=");
|
||||||
|
paramStr.append(kv.getValue());
|
||||||
|
paramStr.append("&");
|
||||||
|
}
|
||||||
|
paramStr.deleteCharAt(paramStr.length() - 1);
|
||||||
|
}
|
||||||
|
return paramStr.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get请求
|
||||||
|
*
|
||||||
|
* @param url
|
||||||
|
* @param headers
|
||||||
|
* @param params
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public Response get(String url, Header[] headers, NameValuePair[] params) throws Exception {
|
||||||
|
HttpClient client = new HttpClient();
|
||||||
|
GetMethod getMethod = new GetMethod(url);
|
||||||
|
if (params != null) {
|
||||||
|
getMethod.setQueryString(params);
|
||||||
|
}
|
||||||
|
if (headers != null) {
|
||||||
|
for (Header header : headers) {
|
||||||
|
getMethod.setRequestHeader(header);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int httpStatus = client.executeMethod(getMethod);
|
||||||
|
String result = getMethod.getResponseBodyAsString();
|
||||||
|
return new Response(httpStatus, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取url查询参数
|
||||||
|
*
|
||||||
|
* @param params
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getQueryString(NameValuePair[] params) {
|
||||||
|
GetMethod getMethod = new GetMethod();
|
||||||
|
getMethod.setQueryString(params);
|
||||||
|
return getMethod.getQueryString();
|
||||||
|
}
|
||||||
|
|
||||||
|
class Response {
|
||||||
|
private int httpStatus;
|
||||||
|
private String data;
|
||||||
|
|
||||||
|
public int getHttpStatus() {
|
||||||
|
return httpStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHttpStatus(int httpStatus) {
|
||||||
|
this.httpStatus = httpStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setData(String data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Response(int httpStatus, String data) {
|
||||||
|
super();
|
||||||
|
this.httpStatus = httpStatus;
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Response() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getSHA256(String str, String key) throws Exception {
|
||||||
|
byte[] salt = new byte[16];
|
||||||
|
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
|
||||||
|
random.setSeed(key.getBytes());
|
||||||
|
random.nextBytes(salt);
|
||||||
|
String salt_value = new BASE64Encoder().encodeBuffer(salt);
|
||||||
|
return digest(str + salt_value.replaceAll("\r|\n", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
* @description 获取AccessToken
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("static-access")
|
||||||
|
public String getAccessTokenByClient() throws Exception {
|
||||||
|
String url = BASE_URL_DEV + "/nccloud/opm/accesstoken";
|
||||||
|
List<Header> headers = new ArrayList<Header>();
|
||||||
|
headers.add(new Header("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"));
|
||||||
|
// 获取信息摘要
|
||||||
|
String signature = getSHA256(CLIENT_ID + CLIENT_SECRET + PUBLIC_KEY, PUBLIC_KEY);
|
||||||
|
// 使用PUBLIC_KEY生成公钥,对CLIENT_SECRET加密
|
||||||
|
SecurityUtil securityUtil = new SecurityUtil();
|
||||||
|
String CLIENT_SECRETEn = URLEncoder.encode(securityUtil.pubEncrypt(PUBLIC_KEY, CLIENT_SECRET), "utf-8");
|
||||||
|
Map<String, Object> params = new HashMap<String, Object>();
|
||||||
|
params.put("client_id", CLIENT_ID);
|
||||||
|
params.put("userCode", USER_CODE);
|
||||||
|
params.put("grant_type", "client_credentials");
|
||||||
|
params.put("biz_center", BIZ_CENTER);
|
||||||
|
params.put("signature", signature);
|
||||||
|
params.put("client_secret", CLIENT_SECRETEn);
|
||||||
|
try {
|
||||||
|
Response response = client.post(url, headers.toArray(new Header[headers.size()]), null, client.getURLParam(params));
|
||||||
|
System.out.println(response.getData());
|
||||||
|
JSONObject result = JSONObject.parseObject(response.getData());
|
||||||
|
boolean success = result.getBoolean("success");
|
||||||
|
if (success) {
|
||||||
|
return result.getJSONObject("data").getString("access_token");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,403 @@
|
||||||
|
package nccloud.api.impl.so.m30;
|
||||||
|
|
||||||
|
import nc.bd.itf.tools.BFPubTools;
|
||||||
|
import nc.bs.dao.BaseDAO;
|
||||||
|
import nc.bs.framework.common.NCLocator;
|
||||||
|
import nc.itf.fi.pub.Currency;
|
||||||
|
import nc.itf.scmpub.reference.uap.pf.PfServiceScmUtil;
|
||||||
|
import nc.itf.so.m30.self.ISaleOrderMaintain;
|
||||||
|
import nc.itf.so.m30.self.ISaleOrderScriptMaintain;
|
||||||
|
import nc.itf.uap.pf.IPFBusiAction;
|
||||||
|
import nc.jdbc.framework.processor.ColumnProcessor;
|
||||||
|
import nc.pubitf.so.m30.api.ISaleOrderQueryAPI;
|
||||||
|
import nc.vo.ml.NCLangRes4VoTransl;
|
||||||
|
import nc.vo.pub.BusinessException;
|
||||||
|
import nc.vo.pub.VOStatus;
|
||||||
|
import nc.vo.pub.lang.UFBoolean;
|
||||||
|
import nc.vo.pub.lang.UFDate;
|
||||||
|
import nc.vo.pub.lang.UFDouble;
|
||||||
|
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||||
|
import nc.vo.pubapp.pflow.PfUserObject;
|
||||||
|
import nc.vo.scmpub.check.billvalidate.BillVOsCheckRule;
|
||||||
|
import nc.vo.scmpub.res.billtype.SOBillType;
|
||||||
|
import nc.vo.scmpub.util.StringUtil;
|
||||||
|
import nc.vo.so.m30.entity.SaleOrderBVO;
|
||||||
|
import nc.vo.so.m30.entity.SaleOrderHVO;
|
||||||
|
import nc.vo.so.m30.entity.SaleOrderVO;
|
||||||
|
import nc.vo.so.m30.revise.entity.SaleOrderHistoryBVO;
|
||||||
|
import nc.vo.so.m30.revise.entity.SaleOrderHistoryHVO;
|
||||||
|
import nc.vo.so.m30.revise.entity.SaleOrderHistoryVO;
|
||||||
|
import nc.vo.so.pub.SOConstant;
|
||||||
|
import nc.vo.so.pub.keyvalue.IKeyValue;
|
||||||
|
import nc.vo.so.pub.keyvalue.VOKeyValue;
|
||||||
|
import nc.vo.so.pub.util.AggVOUtil;
|
||||||
|
import nc.vo.so.pub.util.SOCurrencyUtil;
|
||||||
|
import nccloud.api.impl.so.m30.check.SaleOrderValidator;
|
||||||
|
import nccloud.api.impl.so.m30.fill.SaleOrderSaveFillValue;
|
||||||
|
import nccloud.api.impl.so.m30.fill.SetUpdateData;
|
||||||
|
import nccloud.api.so.m30.IAPISaleOrderMaitain;
|
||||||
|
import nccloud.baseapp.core.log.NCCForUAPLogger;
|
||||||
|
import nccloud.dto.scmpub.pflow.SCMCloudPFlowContext;
|
||||||
|
import nccloud.pubitf.scmpub.commit.service.IBatchRunScriptService;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 销售订单维护实现类
|
||||||
|
* @author: yanghff
|
||||||
|
* @date: 2019-10-23 下午4:57:49
|
||||||
|
* @Copyright:
|
||||||
|
*/
|
||||||
|
public class APISaleOrderMaitainImpl2 implements IAPISaleOrderMaitain {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SaleOrderVO[] save(SaleOrderVO[] vos) throws BusinessException {
|
||||||
|
|
||||||
|
SaleOrderVO[] fillvos = vos;
|
||||||
|
// 检查非空项
|
||||||
|
for (SaleOrderVO vo : vos) {
|
||||||
|
SaleOrderHVO hvo = vo.getParentVO();
|
||||||
|
String corigcurrencyid = hvo.getCorigcurrencyid();
|
||||||
|
UFDate dbilldate = hvo.getDbilldate();
|
||||||
|
SaleOrderBVO[] bvos = vo.getChildrenVO();
|
||||||
|
String sql = " select bd_currtype.pk_currtype from bd_currtype where (code='" + hvo.getCorigcurrencyid() + "' or pk_currtype='" + hvo.getCorigcurrencyid() + "') and dr=0 ";
|
||||||
|
Object o = new BaseDAO().executeQuery(sql, new ColumnProcessor());
|
||||||
|
if (o != null) {
|
||||||
|
hvo.setCorigcurrencyid(BFPubTools.getString_TrimAsNull(o));
|
||||||
|
} else {
|
||||||
|
throw new BusinessException("表头币种不能为空或币种不存在");
|
||||||
|
}
|
||||||
|
sql = " select bd_currtype.pk_currtype from bd_currtype where (code='" + bvos[0].getCcurrencyid() + "' or pk_currtype='" + bvos[0].getCcurrencyid() + "') and dr=0 ";
|
||||||
|
Object o1 = new BaseDAO().executeQuery(sql, new ColumnProcessor());
|
||||||
|
if (o1 == null) {
|
||||||
|
throw new BusinessException("表体币种不能为空或币种不存在");
|
||||||
|
}
|
||||||
|
String csettleorgid = bvos[0].getCsettleorgid();
|
||||||
|
String ccurrencyorgid = o1.toString();
|
||||||
|
UFDouble exchangerate = SOCurrencyUtil.getInCurrencyRateByOrg(csettleorgid, BFPubTools.getString_TrimAsNull(o), ccurrencyorgid, dbilldate);
|
||||||
|
for (SaleOrderBVO bvo : bvos) {
|
||||||
|
bvo.setCcurrencyid(BFPubTools.getString_TrimAsNull(o1));
|
||||||
|
if (!BFPubTools.getString_TrimAsNull(o).equals(ccurrencyorgid)) {
|
||||||
|
bvo.setNexchangerate(exchangerate);
|
||||||
|
} else {
|
||||||
|
bvo.setNexchangerate(UFDouble.ONE_DBL);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// bvo.setNexchangerate(rateReturnObject.getRate());
|
||||||
|
// bvo.setCratetype(rateReturnObject.getPk_ratetype());
|
||||||
|
// bvo.setFratecategory( rateReturnObject.getRate_category());
|
||||||
|
// bvo.setDratedate( rateReturnObject.getDate());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BillVOsCheckRule checker = new BillVOsCheckRule(new SaleOrderValidator());
|
||||||
|
checker.check(vos);
|
||||||
|
// 填充默认值
|
||||||
|
new SaleOrderSaveFillValue().setDefValue(vos);
|
||||||
|
// 有值不覆盖
|
||||||
|
for (SaleOrderVO ordervo : vos) {
|
||||||
|
calculatorPrice(ordervo);
|
||||||
|
}
|
||||||
|
|
||||||
|
SaleOrderVO[] combinBillVOs =
|
||||||
|
(SaleOrderVO[]) AggVOUtil.combinBillVO(fillvos, vos);
|
||||||
|
// 保存
|
||||||
|
SaleOrderVO[] retvos =
|
||||||
|
(SaleOrderVO[]) PfServiceScmUtil.processBatch(SOConstant.WRITE,
|
||||||
|
SOBillType.Order.getCode(), combinBillVOs, null, null);
|
||||||
|
|
||||||
|
SaleOrderVO[] billvos = ((ISaleOrderQueryAPI) NCLocator.getInstance().lookup(ISaleOrderQueryAPI.class)).queryVOByIDs(new String[]{retvos[0].getParentVO().getPrimaryKey()});
|
||||||
|
if (billvos != null) {
|
||||||
|
((IPFBusiAction) NCLocator.getInstance().lookup(IPFBusiAction.class)).processAction("APPROVE", billvos[0].getParentVO().getVtrantypecode(), null, billvos[0], null, null);
|
||||||
|
}
|
||||||
|
return retvos;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void calculatorPrice(SaleOrderVO ordervo) throws BusinessException {
|
||||||
|
|
||||||
|
|
||||||
|
IKeyValue keyValue = new VOKeyValue<SaleOrderVO>(ordervo);
|
||||||
|
|
||||||
|
|
||||||
|
String ctrantypeid = keyValue.getHeadStringValue(SaleOrderHVO.CTRANTYPEID);
|
||||||
|
if (StringUtil.isEmptyTrimSpace(ctrantypeid)) {
|
||||||
|
ExceptionUtils.wrappBusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("4006013_0", "04006013-0024")/*@res "请先选择交易类型!"*/);
|
||||||
|
}
|
||||||
|
// 1.缓存交易类型VO
|
||||||
|
|
||||||
|
SaleOrderBVO[] vbos = ordervo.getChildrenVO();
|
||||||
|
UFDouble sumnum = UFDouble.ZERO_DBL;
|
||||||
|
UFDouble sumnny = UFDouble.ZERO_DBL;
|
||||||
|
String ybpk = ordervo.getParentVO().getCorigcurrencyid();
|
||||||
|
|
||||||
|
for (int i = 0; i < vbos.length; i++) {
|
||||||
|
SaleOrderBVO childrenVO = vbos[i];
|
||||||
|
String zbbz = childrenVO.getCcurrencyid();
|
||||||
|
|
||||||
|
childrenVO.setFtaxtypeflag(1);
|
||||||
|
//得到税率
|
||||||
|
UFDouble ntaxrate = BFPubTools.getUFDouble_NullAsZero(childrenVO.getNtaxrate());
|
||||||
|
|
||||||
|
// 折本汇率
|
||||||
|
UFDouble nexchangerate = childrenVO.getNexchangerate();
|
||||||
|
//含税单价
|
||||||
|
UFDouble nqtorigtaxprice = childrenVO.getNqtorigtaxprice();
|
||||||
|
//无税单价
|
||||||
|
UFDouble nqtorigprice = nqtorigtaxprice.div(UFDouble.ONE_DBL.add(ntaxrate.div(100)));
|
||||||
|
// 价税合计
|
||||||
|
// UFDouble norigtaxmny=nqtorigtaxprice.multiply(childrenVO.getNqtunitnum());
|
||||||
|
UFDouble norigtaxmny = nqtorigtaxprice.multiply(childrenVO.getNqtunitnum()).setScale(2, 4);
|
||||||
|
childrenVO.setNorigtaxmny(norigtaxmny);
|
||||||
|
//无税金额
|
||||||
|
UFDouble norigmny = nqtorigprice.multiply(childrenVO.getNqtunitnum());
|
||||||
|
|
||||||
|
childrenVO.setNorigmny(Currency.getFormaUfValue(ybpk, norigmny));
|
||||||
|
//税额
|
||||||
|
childrenVO.setNqtorigprice(nqtorigprice.setScale(4, 4));
|
||||||
|
|
||||||
|
|
||||||
|
//无税本币金额单价
|
||||||
|
UFDouble taxspric = nqtorigtaxprice.div(UFDouble.ONE_DBL.add(ntaxrate.div(100)));
|
||||||
|
|
||||||
|
|
||||||
|
sumnum = sumnum.add(childrenVO.getNastnum());
|
||||||
|
sumnny = sumnny.add(childrenVO.getNorigtaxmny());
|
||||||
|
|
||||||
|
|
||||||
|
nqtorigprice = nqtorigprice.setScale(4, 4);
|
||||||
|
//nqtorigtaxnetprc--含税净价
|
||||||
|
childrenVO.setNqtorigtaxnetprc(nqtorigtaxprice);
|
||||||
|
//,nqtorignetprice --无税净价
|
||||||
|
childrenVO.setNqtorignetprice(nqtorigprice);
|
||||||
|
String Vqtunitrate = childrenVO.getVqtunitrate();
|
||||||
|
UFDouble dVqtunitrate = UFDouble.ONE_DBL;
|
||||||
|
if (Vqtunitrate != null) {
|
||||||
|
dVqtunitrate = BFPubTools.getUFDouble_NullAsZero(Vqtunitrate.split("/")[0]);
|
||||||
|
}
|
||||||
|
//,norigtaxprice --主含税单价
|
||||||
|
|
||||||
|
UFDouble wsje = taxspric.multiply(nexchangerate).multiply(childrenVO.getNqtunitnum());
|
||||||
|
if (ybpk.equals(zbbz) && BFPubTools.getString_TrimAsNull(childrenVO.getCqtunitid()).equals(BFPubTools.getString_TrimAsNull(childrenVO.getCastunitid()))) {
|
||||||
|
wsje = taxspric.multiply(nexchangerate).multiply(childrenVO.getNqtunitnum());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wsje = Currency.getFormaUfValue(zbbz, wsje);
|
||||||
|
//本币无税金额
|
||||||
|
childrenVO.setNorigtaxprice(nqtorigtaxprice.div(dVqtunitrate).setScale(4, 4));
|
||||||
|
//,norigprice --主无税单价
|
||||||
|
childrenVO.setNorigprice(nqtorigprice.div(dVqtunitrate).setScale(4, 4));
|
||||||
|
//,norigtaxnetprice --主含税净价
|
||||||
|
childrenVO.setNorigtaxnetprice(childrenVO.getNorigtaxprice());
|
||||||
|
//,norignetprice --主无税净价
|
||||||
|
childrenVO.setNorignetprice(childrenVO.getNorigprice());
|
||||||
|
// ncaltaxmny --计税金额
|
||||||
|
|
||||||
|
// ,nqttaxprice --本币含税单价
|
||||||
|
childrenVO.setNqttaxprice(nqtorigtaxprice.multiply(nexchangerate));
|
||||||
|
//,nqtprice --本币无税单价
|
||||||
|
UFDouble bbwsd = nqtorigtaxprice.div(UFDouble.ONE_DBL.add(ntaxrate.div(100))).multiply(nexchangerate);
|
||||||
|
childrenVO.setNqtprice(bbwsd.setScale(4, 4));
|
||||||
|
//, nqttaxnetprice --本币含税净价
|
||||||
|
childrenVO.setNqttaxnetprice(nqtorigtaxprice.multiply(nexchangerate));
|
||||||
|
//,nqtnetprice --本币无税净价
|
||||||
|
UFDouble Nqtnetprice = nqtorigtaxprice.div(UFDouble.ONE_DBL.add(ntaxrate.div(100))).multiply(nexchangerate);
|
||||||
|
childrenVO.setNqtnetprice(Nqtnetprice.setScale(4, 4));
|
||||||
|
//,ntaxprice --主本币含税单价 , nprice --主本币无税单价
|
||||||
|
childrenVO.setNtaxprice(nqtorigtaxprice.div(dVqtunitrate).multiply(nexchangerate).setScale(4, 4));
|
||||||
|
UFDouble Nprice = nqtorigtaxprice.div(dVqtunitrate).div(UFDouble.ONE_DBL.add(ntaxrate.div(100))).multiply(nexchangerate);
|
||||||
|
childrenVO.setNprice(Nprice.setScale(4, 4));
|
||||||
|
//,ntaxnetprice --主本币含税净价
|
||||||
|
//,nnetprice --主本币无税净价
|
||||||
|
childrenVO.setNtaxnetprice(nqtorigtaxprice.div(dVqtunitrate).multiply(nexchangerate).setScale(4, 4));
|
||||||
|
UFDouble Nnetprice = nqtorigtaxprice.div(UFDouble.ONE_DBL.add(ntaxrate.div(100))).div(dVqtunitrate);
|
||||||
|
childrenVO.setNnetprice(Nnetprice.multiply(nexchangerate).setScale(4, 4));
|
||||||
|
// ,nmny --本币无税金额
|
||||||
|
// ,ntaxmny --本币价税合计
|
||||||
|
childrenVO.setNmny(Currency.getFormaUfValue(zbbz, norigmny.multiply(nexchangerate)));
|
||||||
|
childrenVO.setNtaxmny(nqtorigtaxprice.multiply(nexchangerate).multiply(childrenVO.getNqtunitnum()).setScale(2, 4));
|
||||||
|
// childrenVO.setNtaxmny(nqtorigtaxprice.multiply(nexchangerate).multiply(childrenVO.getNqtunitnum()));
|
||||||
|
childrenVO.setNcaltaxmny(wsje);
|
||||||
|
UFDouble ntax = norigtaxmny.multiply(nexchangerate).sub(wsje);
|
||||||
|
childrenVO.setNtax(ntax.setScale(2, 4));
|
||||||
|
}
|
||||||
|
ordervo.getParentVO().setNtotalnum(sumnum);
|
||||||
|
// ordervo.getParentVO().setNtotalorigmny(sumnny);
|
||||||
|
ordervo.getParentVO().setNtotalorigmny(sumnny.setScale(2, 4));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SaleOrderVO[] update(SaleOrderVO[] vos) throws BusinessException {
|
||||||
|
|
||||||
|
// 获取参数vo的id
|
||||||
|
Map<String, Set<String>> ids = this.getIds(vos);
|
||||||
|
if (ids.keySet() == null || ids.values() == null
|
||||||
|
|| ids.values().size() == 0) {
|
||||||
|
ExceptionUtils.wrappBusinessException("请传入订单主键和订单行主键");
|
||||||
|
}
|
||||||
|
String[] hids = ids.keySet().toArray(new String[ids.keySet().size()]);
|
||||||
|
// 查询销售订单
|
||||||
|
ISaleOrderMaintain service =
|
||||||
|
NCLocator.getInstance().lookup(ISaleOrderMaintain.class);
|
||||||
|
SaleOrderVO[] originVos = service.querySaleorder(hids);
|
||||||
|
SetUpdateData setData = new SetUpdateData();
|
||||||
|
setData.setData(vos, originVos);
|
||||||
|
setOtherId(vos);
|
||||||
|
// 有值不覆盖
|
||||||
|
SaleOrderVO[] combinBillVOs =
|
||||||
|
(SaleOrderVO[]) AggVOUtil.combinBillVO(vos, originVos);
|
||||||
|
// 设置单据状态
|
||||||
|
for (SaleOrderVO vo : vos) {
|
||||||
|
vo.getParentVO().setStatus(VOStatus.UPDATED);
|
||||||
|
for (SaleOrderBVO bvo : vo.getChildrenVO()) {
|
||||||
|
bvo.setStatus(VOStatus.UPDATED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 保存
|
||||||
|
ISaleOrderScriptMaintain maintainsrv =
|
||||||
|
NCLocator.getInstance().lookup(ISaleOrderScriptMaintain.class);
|
||||||
|
SaleOrderVO[] retvos =
|
||||||
|
maintainsrv.saleOrderUpdate(combinBillVOs, null, originVos);
|
||||||
|
return retvos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 获取参数vo的id
|
||||||
|
* @date: 2019-11-1 上午10:31:42
|
||||||
|
* @version NCC1909
|
||||||
|
*/
|
||||||
|
private Map<String, Set<String>> getIds(SaleOrderVO[] vos) {
|
||||||
|
Map<String, Set<String>> ids = new HashMap<String, Set<String>>();
|
||||||
|
for (SaleOrderVO vo : vos) {
|
||||||
|
String hid = vo.getParentVO().getCsaleorderid();
|
||||||
|
Set<String> bids = new HashSet<String>();
|
||||||
|
for (SaleOrderBVO bvo : vo.getChildrenVO()) {
|
||||||
|
bids.add(bvo.getCsaleorderbid());
|
||||||
|
}
|
||||||
|
ids.put(hid, bids);
|
||||||
|
}
|
||||||
|
return ids;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setOtherId(SaleOrderVO[] vos) {
|
||||||
|
for (SaleOrderVO vo : vos) {
|
||||||
|
// 部门、业务员、开票客户编码转id
|
||||||
|
String cdeptvid = vo.getParentVO().getCdeptvid();
|
||||||
|
String cemployeeid = vo.getParentVO().getCdeptvid();
|
||||||
|
String cinvoicecustid = vo.getParentVO().getCdeptvid();
|
||||||
|
try {
|
||||||
|
String sql = "";
|
||||||
|
// 部门
|
||||||
|
if (cdeptvid != null && !cdeptvid.isEmpty()) {
|
||||||
|
sql = " select pk_dept from org_dept where code = '[code]' ";
|
||||||
|
sql = sql.replace("[code]", cdeptvid);
|
||||||
|
Object deptObj = new BaseDAO().executeQuery(sql, new ColumnProcessor());
|
||||||
|
NCCForUAPLogger.debug("APISaleOrderMaitainImpl-setOtherId-deptObj:" + deptObj);
|
||||||
|
if (deptObj != null) {
|
||||||
|
String id = BFPubTools.getString_TrimAsNull(deptObj);
|
||||||
|
if (!id.isEmpty()) {
|
||||||
|
vo.getParentVO().setCdeptvid(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 业务员
|
||||||
|
if (cemployeeid != null && !cemployeeid.isEmpty()) {
|
||||||
|
sql = " select pk_psndoc from bd_psndoc where code = '[code]' ";
|
||||||
|
sql = sql.replace("[code]", cemployeeid);
|
||||||
|
Object staffObj = new BaseDAO().executeQuery(sql, new ColumnProcessor());
|
||||||
|
NCCForUAPLogger.debug("APISaleOrderMaitainImpl-setOtherId-staffObj:" + staffObj);
|
||||||
|
if (staffObj != null) {
|
||||||
|
String id = BFPubTools.getString_TrimAsNull(staffObj);
|
||||||
|
if (!id.isEmpty()) {
|
||||||
|
vo.getParentVO().setCdeptvid(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 开票客户
|
||||||
|
if (cinvoicecustid != null && !cinvoicecustid.isEmpty()) {
|
||||||
|
sql = " select pk_customer from bd_customer where code = '[code]' ";
|
||||||
|
sql = sql.replace("[code]", cinvoicecustid);
|
||||||
|
Object invCustObj = new BaseDAO().executeQuery(sql, new ColumnProcessor());
|
||||||
|
NCCForUAPLogger.debug("APISaleOrderMaitainImpl-setOtherId-invCustObj:" + invCustObj);
|
||||||
|
if (invCustObj != null) {
|
||||||
|
String id = BFPubTools.getString_TrimAsNull(invCustObj);
|
||||||
|
if (!id.isEmpty()) {
|
||||||
|
vo.getParentVO().setCdeptvid(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
NCCForUAPLogger.debug("APISaleOrderMaitainImpl-setOtherId-exp:" + e.getMessage());
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SaleOrderVO[] modify(SaleOrderHistoryVO[] vos) throws BusinessException {
|
||||||
|
for (SaleOrderHistoryVO vo : vos) {
|
||||||
|
SaleOrderHistoryHVO hvo = vo.getParentVO();
|
||||||
|
UFDate dbilldate = hvo.getDbilldate();
|
||||||
|
SaleOrderHistoryBVO[] bvos = vo.getChildrenVO();
|
||||||
|
String sql = " select bd_currtype.pk_currtype from bd_currtype where (code='" + hvo.getCorigcurrencyid() + "' or pk_currtype='" + hvo.getCorigcurrencyid() + "') and dr=0 ";
|
||||||
|
Object o = new BaseDAO().executeQuery(sql, new ColumnProcessor());
|
||||||
|
if (o != null) {
|
||||||
|
hvo.setCorigcurrencyid(BFPubTools.getString_TrimAsNull(o));
|
||||||
|
} else {
|
||||||
|
throw new BusinessException("表头币种不能为空或币种不存在");
|
||||||
|
}
|
||||||
|
sql = " select bd_currtype.pk_currtype from bd_currtype where (code='" + bvos[0].getCcurrencyid() + "' or pk_currtype='" + bvos[0].getCcurrencyid() + "') and dr=0 ";
|
||||||
|
Object o1 = new BaseDAO().executeQuery(sql, new ColumnProcessor());
|
||||||
|
if (o1 == null) {
|
||||||
|
throw new BusinessException("表体币种不能为空或币种不存在");
|
||||||
|
}
|
||||||
|
String csettleorgid = bvos[0].getCsettleorgid();
|
||||||
|
String ccurrencyorgid = o1.toString();
|
||||||
|
UFDouble exchangerate = SOCurrencyUtil.getInCurrencyRateByOrg(csettleorgid, BFPubTools.getString_TrimAsNull(o), ccurrencyorgid, dbilldate);
|
||||||
|
for (SaleOrderHistoryBVO bvo : bvos) {
|
||||||
|
bvo.setCcurrencyid(BFPubTools.getString_TrimAsNull(o1));
|
||||||
|
if (!BFPubTools.getString_TrimAsNull(o).equals(ccurrencyorgid)) {
|
||||||
|
bvo.setNexchangerate(exchangerate);
|
||||||
|
} else {
|
||||||
|
bvo.setNexchangerate(UFDouble.ONE_DBL);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (SaleOrderVO ordervo : vos) {
|
||||||
|
calculatorPrice(ordervo);
|
||||||
|
}
|
||||||
|
Map<Object, Object> eParam = new HashMap<Object, Object>();
|
||||||
|
eParam.put("nolockandconsist", UFBoolean.TRUE);
|
||||||
|
|
||||||
|
SCMCloudPFlowContext context = new SCMCloudPFlowContext();
|
||||||
|
context.setBillType(SOBillType.Order30R.getCode());
|
||||||
|
PfUserObject userObject = new PfUserObject();
|
||||||
|
userObject.setUserObject(null);
|
||||||
|
context.seteParam(eParam);
|
||||||
|
context.setUserObj(new PfUserObject[]{userObject});
|
||||||
|
context.setBillVos(vos);
|
||||||
|
context.setActionName("REVISEWRITE");
|
||||||
|
IBatchRunScriptService service2 = (IBatchRunScriptService) NCLocator.getInstance().lookup(IBatchRunScriptService.class);
|
||||||
|
SaleOrderHistoryVO[] objects = (SaleOrderHistoryVO[]) service2.run(context, SaleOrderHistoryVO.class);
|
||||||
|
|
||||||
|
|
||||||
|
return (SaleOrderVO[]) NCLocator.getInstance().lookup(IPFBusiAction.class).processAction("APPROVE", "30R", null, objects[0], null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void cheageHVo(SaleOrderHistoryVO billvo, SaleOrderVO saleOrderVO) {
|
||||||
|
SaleOrderHistoryHVO hvo = billvo.getParentVO();
|
||||||
|
SaleOrderHVO oldvo = saleOrderVO.getParentVO();
|
||||||
|
hvo.setCinvoicecustid(oldvo.getCinvoicecustid());
|
||||||
|
hvo.setCemployeeid(oldvo.getCemployeeid());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue