You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
430 lines
14 KiB
430 lines
14 KiB
package com.sinosoft.lis.certify;
|
|
|
|
import com.sinosoft.lis.i18n.I18nMessage;
|
|
import com.sinosoft.lis.db.LZCardAppDB;
|
|
import com.sinosoft.lis.pubfun.GlobalInput;
|
|
import com.sinosoft.lis.pubfun.PubFun;
|
|
import com.sinosoft.lis.pubfun.PubFun1;
|
|
import com.sinosoft.lis.schema.LAAgentSchema;
|
|
import com.sinosoft.lis.schema.LZCardSchema;
|
|
import com.sinosoft.lis.sql.repository.LAAgentSQL;
|
|
import com.sinosoft.lis.sql.repository.LABranchGroupSQL;
|
|
import com.sinosoft.lis.sql.repository.LZCardSQL;
|
|
import com.sinosoft.lis.vschema.LAAgentSet;
|
|
import com.sinosoft.lis.vschema.LABranchGroupSet;
|
|
import com.sinosoft.lis.vschema.LZCardAppSet;
|
|
import com.sinosoft.lis.vschema.LZCardSet;
|
|
import com.sinosoft.persistence.SQLProxy;
|
|
import com.sinosoft.service.BusinessService;
|
|
import com.sinosoft.utility.CError;
|
|
import com.sinosoft.utility.CErrors;
|
|
import com.sinosoft.utility.SSRS;
|
|
import com.sinosoft.utility.VData;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import java.util.Hashtable;
|
|
|
|
/**
|
|
* <p>
|
|
* Title: Web业务系统
|
|
* </p>
|
|
* <p>
|
|
* Description:单证管理单证发放操作
|
|
* </p>
|
|
* <p>
|
|
* Copyright: Copyright (c) 2002
|
|
* </p>
|
|
* <p>
|
|
* Company: Sinosoft
|
|
* </p>
|
|
*
|
|
* @author 周平
|
|
* @version 1.0
|
|
*/
|
|
|
|
public class CertSendOutBL extends CertifyBO implements BusinessService {
|
|
private static final Logger logger = LoggerFactory.getLogger(CertSendOutBL.class);
|
|
// 错误处理类,每个需要错误处理的类中都放置该类
|
|
public CErrors mErrors = new CErrors();
|
|
|
|
/* 私有成员 */
|
|
private String mszOperate = "";
|
|
|
|
private String mszTakeBackNo = "";
|
|
|
|
/* 业务相关的数据 */
|
|
private GlobalInput globalInput = new GlobalInput();
|
|
|
|
private LZCardSet mLZCardSet = new LZCardSet();
|
|
|
|
private LZCardAppSet mLZCardAppSet = new LZCardAppSet();
|
|
|
|
private boolean m_bLimitFlag = true;;
|
|
|
|
private Hashtable mParams = null;
|
|
|
|
private VData mResult = new VData();
|
|
|
|
// 记录下当前操作到哪一条记录,如果操作没有成功完成,给用户返回所有未能成功处理的数据。
|
|
private int m_nOperIndex = 0;
|
|
|
|
public CertSendOutBL() {
|
|
}
|
|
|
|
// 传输数据的公共方法
|
|
public boolean submitData(VData cInputData, String cOperate) {
|
|
mszOperate = cOperate;
|
|
|
|
if (!getInputData(cInputData))
|
|
{
|
|
buildFailSet();
|
|
return false;
|
|
}
|
|
|
|
if (!dealData()) {
|
|
buildFailSet();
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// 从输入数据中得到所有对象
|
|
// 输出:如果没有得到足够的业务数据对象,则返回false,否则返回true
|
|
private boolean getInputData(VData vData) {
|
|
if (mszOperate.equals("INSERT")) {
|
|
globalInput.setSchema(vData.get(GlobalInput.class, 0));
|
|
mLZCardSet.set(vData.get(LZCardSet.class, 0));
|
|
} else if (mszOperate.equals("ADD")) {// 增领单证,将页面LZCardAppSet转化为mLZCardSet
|
|
globalInput.setSchema(vData.get(GlobalInput.class, 0));
|
|
mLZCardSet.set(vData.get(LZCardSet.class, 0));
|
|
|
|
for (int i = 1; i <= mLZCardSet.size(); i++) {
|
|
LZCardSchema tLZCardSchema = mLZCardSet.get(i);
|
|
LZCardAppDB tLZCardAppDB = new LZCardAppDB();
|
|
tLZCardAppDB.setApplyNo(tLZCardSchema.getApplyNo());
|
|
if (tLZCardAppDB.getInfo()) {
|
|
if (tLZCardSchema.getStartNo() != null && !tLZCardSchema.getStartNo().equals("")
|
|
&& tLZCardSchema.getEndNo() != null && !tLZCardSchema.getEndNo().equals("")) {
|
|
long inCount = CertifyFunc.bigIntegerDiff(tLZCardSchema.getEndNo(), tLZCardSchema
|
|
.getStartNo()) + 1;// 页面输入起止号之差
|
|
if (inCount != tLZCardAppDB.getSumCount()) {
|
|
buildError("getInputData", new I18nMessage("输入实际领取数量【{0}】不等于申请增领单证数量【{1}】", "LIS-16088" , inCount, tLZCardAppDB.getSumCount()));
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else if (mszOperate.equals("BATCH")) {
|
|
globalInput.setSchema(vData.get(GlobalInput.class, 0));
|
|
mLZCardSet.set(vData.get(LZCardSet.class, 0));
|
|
} else {
|
|
buildError("getInputData", new I18nMessage("不支持的操作字符串", "LIS-07202"));
|
|
return false;
|
|
}
|
|
long cardnum=0;
|
|
for (int nIndex = 1; nIndex <= mLZCardSet.size(); nIndex++)
|
|
{
|
|
LZCardSchema tLZCardSchema =mLZCardSet.get(nIndex);
|
|
char cFlag = tLZCardSchema.getReceiveCom().charAt(0);
|
|
if ((cFlag == 'B' || cFlag == 'D' || tLZCardSchema.getReceiveCom().length() == 9))
|
|
{
|
|
//20101-02-01增加单证数量的控制
|
|
if( !"".equals(tLZCardSchema.getEndNo()) && !"".equals(tLZCardSchema.getStartNo()))
|
|
cardnum=cardnum+ CertifyFunc.bigIntegerDiff(tLZCardSchema.getEndNo(), tLZCardSchema.getStartNo()) + 1;
|
|
else
|
|
cardnum=cardnum+tLZCardSchema.getSumCount();
|
|
}
|
|
}
|
|
if(cardnum>10000)
|
|
{
|
|
CError.buildErr(this, new I18nMessage("一次单证操作的单证数量不能超过10000张,请减少单证数量", "LIS-07958"));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// 根据前面的输入数据,进行逻辑处理
|
|
// 如果在处理过程中出错,则返回false,否则返回true
|
|
private boolean dealData() {
|
|
if (mszOperate.equals("INSERT") || mszOperate.equals("ADD")) {
|
|
// 产生回收清算单号
|
|
mszTakeBackNo = PubFun1.CreateMaxNo("TAKEBACKNO", PubFun.getNoLimit(globalInput.ComCode));
|
|
|
|
m_nOperIndex = 0;
|
|
for (int nIndex = 0; nIndex < mLZCardSet.size(); nIndex++) {
|
|
LZCardSchema tLZCardSchema = mLZCardSet.get(nIndex + 1);
|
|
|
|
// 校验输入的发放者和接收者
|
|
if (!CertifyFunc.verifyComs(globalInput, tLZCardSchema.getSendOutCom(), tLZCardSchema
|
|
.getReceiveCom())) {
|
|
mErrors.copyAllErrors(CertifyFunc.mErrors);
|
|
return false;
|
|
}
|
|
|
|
// 校验代理人最大发放数量
|
|
if (mszOperate.equals("INSERT") && !CertifyFunc.verifyMaxCount(tLZCardSchema)) {
|
|
mErrors.copyAllErrors(CertifyFunc.mErrors);
|
|
return false;
|
|
}
|
|
|
|
// 对传入的单证信息进行格式化。
|
|
LZCardSet newLZCardSet = new LZCardSet();
|
|
newLZCardSet = CertifyFunc.formatCardList(tLZCardSchema);
|
|
if (newLZCardSet == null) {
|
|
mErrors.copyAllErrors(CertifyFunc.mErrors);
|
|
return false;
|
|
}
|
|
|
|
// 处理数据
|
|
VData vResult = new VData();
|
|
for (int nCount = 0; nCount < newLZCardSet.size(); nCount++) {
|
|
LZCardSchema newLZCardSchema = newLZCardSet.get(nCount + 1);
|
|
newLZCardSchema.setTakeBackNo(mszTakeBackNo);
|
|
newLZCardSchema.setApplyNo(tLZCardSchema.getApplyNo());
|
|
|
|
VData vOneResult = new VData();
|
|
// 进行单证拆分操作
|
|
if (!CertifyFunc.splitCertifySendOut(globalInput, newLZCardSchema, vOneResult)) {
|
|
mErrors.copyAllErrors(CertifyFunc.mErrors);
|
|
return false;
|
|
}
|
|
vResult.add(vOneResult);
|
|
}
|
|
|
|
// 增领单证更新其申请状态
|
|
if (mszOperate.equals("ADD")) {
|
|
LZCardAppDB tLZCardAppDB = new LZCardAppDB();
|
|
tLZCardAppDB.setApplyNo(tLZCardSchema.getApplyNo());
|
|
tLZCardAppDB.getInfo();
|
|
tLZCardAppDB.setStateFlag("3");
|
|
tLZCardAppDB.setStartNo(tLZCardSchema.getStartNo());
|
|
tLZCardAppDB.setEndNo(tLZCardSchema.getEndNo());
|
|
|
|
VData vOneResult = new VData();
|
|
vOneResult.add(0, null);
|
|
vOneResult.add(1, null);
|
|
vOneResult.add(2, null);
|
|
vOneResult.add(3, null);
|
|
vOneResult.add(4, null);
|
|
vOneResult.add(5, null);
|
|
vOneResult.add(6, null);
|
|
vOneResult.add(7, null);
|
|
vOneResult.set(7, tLZCardAppDB.getSchema());
|
|
vResult.add(vOneResult);
|
|
}
|
|
|
|
// 保存数据
|
|
CertSendOutBLS tCertSendOutBLS = new CertSendOutBLS();
|
|
if (!tCertSendOutBLS.submitData(vResult, "INSERT")) {
|
|
if (tCertSendOutBLS.mErrors.needDealError()) {
|
|
mErrors.copyAllErrors(tCertSendOutBLS.mErrors);
|
|
return false;
|
|
} else {
|
|
buildError("dealOne", new I18nMessage("CertSendOutBL出错,但是没有提供详细的信息", "LIS-07881"));
|
|
return false;
|
|
}
|
|
}
|
|
m_nOperIndex++; // 记录下当前操作到哪一条记录
|
|
}
|
|
} else if (mszOperate.equals("BATCH")) {
|
|
// 清空日志表
|
|
clearLog();
|
|
|
|
// 产生回收清算单号
|
|
mszTakeBackNo = PubFun1.CreateMaxNo("TAKEBACKNO", PubFun.getNoLimit(globalInput.ComCode));
|
|
mResult.clear();
|
|
mResult.add(mszTakeBackNo);
|
|
|
|
m_nOperIndex = 0;
|
|
for (int nIndex = 0; nIndex < mLZCardSet.size(); nIndex++) {
|
|
LZCardSchema tLZCardSchema = mLZCardSet.get(nIndex + 1);
|
|
tLZCardSchema.setTakeBackNo(mszTakeBackNo);
|
|
if (!batchSendOut(tLZCardSchema)) {
|
|
continue;
|
|
}
|
|
m_nOperIndex++; // 记录下当前操作到哪一条记录
|
|
}
|
|
} else {
|
|
buildError("dealData", new I18nMessage("不支持的操作字符串", "LIS-07202"));
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 处理一条单证发放的信息。
|
|
*
|
|
* @param aLZCardSchema
|
|
* @return
|
|
*/
|
|
private boolean dealOne(LZCardSchema aLZCardSchema, VData vResult) {
|
|
// 进行单证拆分操作
|
|
if (!CertifyFunc.splitCertifySendOut(globalInput, aLZCardSchema, vResult)) {
|
|
mErrors.copyAllErrors(CertifyFunc.mErrors);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public VData getResult() {
|
|
return mResult;
|
|
}
|
|
|
|
@Override
|
|
public CErrors getErrors() {
|
|
return mErrors;
|
|
}
|
|
|
|
/**
|
|
* 对于每一个发放者、接收者、单证类型。执行下面的函数。 此时的接收者,应该是一个展业机构的代码。
|
|
*
|
|
* @param aLZCardSchema
|
|
* @return
|
|
*/
|
|
private boolean batchSendOut(LZCardSchema aLZCardSchema) {
|
|
String szReceiveCom = aLZCardSchema.getReceiveCom();
|
|
boolean bReturn = true;
|
|
LABranchGroupSQL laBranchGroupSQL = SQLProxy.getInstance(LABranchGroupSQL.class);
|
|
LABranchGroupSet tLABranchGroupSet = laBranchGroupSQL.findAllByBranchAttrLike(szReceiveCom);
|
|
if (tLABranchGroupSet.size() == 0) {
|
|
logError(aLZCardSchema, "展业机构" + szReceiveCom + "不存在");
|
|
bReturn = false;
|
|
} else {
|
|
for (int nIndex = 0; nIndex < tLABranchGroupSet.size(); nIndex++) {
|
|
bReturn = batchGroupSendOut(globalInput, aLZCardSchema, tLABranchGroupSet.get(nIndex + 1)
|
|
.getAgentGroup());
|
|
if (!bReturn) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
/**
|
|
* Kevin 2003-05-28 往一个代理人组中所有代理人发放指定类型的单证,使所有代理人手中的该种单证数量达到所能 执有的最大数量。
|
|
*
|
|
* @param aGlobalInput
|
|
* @param aLZCardSchema
|
|
* @param strAgentBranchCode
|
|
* @return
|
|
*/
|
|
private boolean batchGroupSendOut(GlobalInput aGlobalInput, LZCardSchema aLZCardSchema,
|
|
String strAgentBranchCode) {
|
|
LAAgentSQL laAgentSQL = SQLProxy.getInstance(LAAgentSQL.class);
|
|
LAAgentSet tLAAgentSet = laAgentSQL.findAllByBranchCode(strAgentBranchCode);
|
|
for (int nIndex = 0; nIndex < tLAAgentSet.size(); nIndex++) {
|
|
LAAgentSchema tLAAgentSchema = tLAAgentSet.get(nIndex + 1);
|
|
|
|
// 构造一个LZCardSchema
|
|
LZCardSchema tLZCardSchema = new LZCardSchema();
|
|
|
|
tLZCardSchema.setCertifyCode(aLZCardSchema.getCertifyCode());
|
|
tLZCardSchema.setSendOutCom(aLZCardSchema.getSendOutCom());
|
|
tLZCardSchema.setReceiveCom("D" + tLAAgentSchema.getAgentCode());
|
|
tLZCardSchema.setTakeBackNo(aLZCardSchema.getTakeBackNo());
|
|
|
|
int nMaxCount = CertifyFunc.getMaxCount(tLZCardSchema.getReceiveCom().substring(1), tLZCardSchema
|
|
.getCertifyCode());
|
|
|
|
if (nMaxCount < 0) {
|
|
logError(tLZCardSchema, "找不到这个代理人的最大领用数配置信息");
|
|
continue; // 缺少某个代理人的最大领用数配置,直接到下一个代理人
|
|
}
|
|
|
|
// 得到代理人现有单证数量
|
|
LZCardSQL lzCardSQL = SQLProxy.getInstance(LZCardSQL.class);
|
|
SSRS ssrs = lzCardSQL.getSumSumCountByStateFlagAndCertifyCodeAndReceiveCom("0", tLZCardSchema.getCertifyCode(),tLZCardSchema.getReceiveCom());
|
|
|
|
// 代理人手中的单证已经达到最大数量
|
|
int nCurCount = Integer.parseInt(ssrs.GetText(1, 1));
|
|
if (nCurCount >= nMaxCount) {
|
|
logError(tLZCardSchema, "代理人执有单证数" + String.valueOf(nCurCount) + "已经达到最大数"
|
|
+ String.valueOf(nMaxCount));
|
|
continue;
|
|
}
|
|
|
|
// 本次需要发放的单证数
|
|
tLZCardSchema.setSumCount(nMaxCount - nCurCount);
|
|
|
|
CertifyFunc.mErrors.clearErrors();
|
|
LZCardSet tLZCardSet = CertifyFunc.findNo(tLZCardSchema);
|
|
|
|
if (tLZCardSet == null) {
|
|
logError(tLZCardSchema, CertifyFunc.mErrors.getFirstError());
|
|
mErrors.copyAllErrors(CertifyFunc.mErrors);
|
|
return false;
|
|
}
|
|
|
|
VData vResult = new VData();
|
|
for (int nInnerIndex = 0; nInnerIndex < tLZCardSet.size(); nInnerIndex++) {
|
|
VData vOneResult = new VData();
|
|
|
|
mErrors.clearErrors();
|
|
CertifyFunc.mErrors.clearErrors();
|
|
if (!dealOne(tLZCardSet.get(nInnerIndex + 1), vOneResult)) {
|
|
logError(tLZCardSet.get(nInnerIndex + 1), mErrors.getFirstError());
|
|
continue;
|
|
}
|
|
vResult.add(vOneResult);
|
|
}
|
|
|
|
// 保存数据
|
|
CertSendOutBLS tCertSendOutBLS = new CertSendOutBLS();
|
|
if (!tCertSendOutBLS.submitData(vResult, "INSERT")) {
|
|
if (tCertSendOutBLS.mErrors.needDealError()) {
|
|
mErrors.copyAllErrors(tCertSendOutBLS.mErrors);
|
|
return false;
|
|
} else {
|
|
buildError("dealOne", new I18nMessage("CertSendOutBL出错,但是没有提供详细的信息", "LIS-07881"));
|
|
return false;
|
|
}
|
|
}
|
|
} // end of for
|
|
|
|
return true;
|
|
}
|
|
|
|
// 准备往后层输出所需要的数据
|
|
// 输出:如果准备数据时发生错误则返回false,否则返回true
|
|
private boolean prepareOutputData(VData vData) {
|
|
try {
|
|
if (mszOperate.equals("INSERT")) {
|
|
vData.clear();
|
|
vData.addElement(globalInput);
|
|
vData.addElement(mLZCardSet);
|
|
}
|
|
} catch (Exception ex) {
|
|
CError tError = new CError();
|
|
tError.moduleName = "CertSendOutBL";
|
|
tError.functionName = "prepareData";
|
|
tError.errorMessage(new I18nMessage("在准备往后层处理所需要的数据时出错。", "LIS-06614"));
|
|
this.mErrors.addOneError(tError);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* add by kevin, 2002-09-23
|
|
*/
|
|
private void buildError(String szFunc, I18nMessage szErrMsg) {
|
|
CError cError = new CError();
|
|
cError.moduleName = "CertSendOutBL";
|
|
cError.functionName = szFunc;
|
|
cError.errorMessage(szErrMsg);
|
|
this.mErrors.addOneError(cError);
|
|
}
|
|
|
|
private void buildFailSet() {
|
|
LZCardSet tLZCardSet = new LZCardSet();
|
|
for (int nIndex = m_nOperIndex; nIndex < mLZCardSet.size(); nIndex++) {
|
|
tLZCardSet.add(mLZCardSet.get(nIndex + 1));
|
|
}
|
|
mResult.add(tLZCardSet);
|
|
}
|
|
}
|
|
|