package com.jsh.erp.service.depotHead;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.jsh.erp.constants.BusinessConstants;
|
import com.jsh.erp.constants.ExceptionConstants;
|
import com.jsh.erp.datasource.entities.*;
|
import com.jsh.erp.datasource.mappers.DepotHeadMapper;
|
import com.jsh.erp.datasource.mappers.DepotHeadMapperEx;
|
import com.jsh.erp.datasource.mappers.DepotItemMapperEx;
|
import com.jsh.erp.datasource.vo.*;
|
import com.jsh.erp.exception.BusinessRunTimeException;
|
import com.jsh.erp.exception.JshException;
|
import com.jsh.erp.service.account.AccountService;
|
import com.jsh.erp.service.accountHead.AccountHeadService;
|
import com.jsh.erp.service.accountItem.AccountItemService;
|
import com.jsh.erp.service.depot.DepotService;
|
import com.jsh.erp.service.depotItem.DepotItemService;
|
import com.jsh.erp.service.log.LogService;
|
import com.jsh.erp.service.orgaUserRel.OrgaUserRelService;
|
import com.jsh.erp.service.person.PersonService;
|
import com.jsh.erp.service.role.RoleService;
|
import com.jsh.erp.service.sequence.SequenceService;
|
import com.jsh.erp.service.serialNumber.SerialNumberService;
|
import com.jsh.erp.service.supplier.SupplierService;
|
import com.jsh.erp.service.systemConfig.SystemConfigService;
|
import com.jsh.erp.service.user.UserService;
|
import com.jsh.erp.service.userBusiness.UserBusinessService;
|
import com.jsh.erp.utils.ExcelUtils;
|
import com.jsh.erp.utils.StringUtil;
|
import com.jsh.erp.utils.Tools;
|
import jxl.Workbook;
|
import jxl.write.WritableWorkbook;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.web.context.request.RequestContextHolder;
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.File;
|
import java.math.BigDecimal;
|
import java.sql.Timestamp;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
import static com.jsh.erp.utils.Tools.getCenternTime;
|
import static com.jsh.erp.utils.Tools.getNow3;
|
|
@Service
|
public class DepotHeadService {
|
private Logger logger = LoggerFactory.getLogger(DepotHeadService.class);
|
|
@Resource
|
private DepotHeadMapper depotHeadMapper;
|
@Resource
|
private DepotHeadMapperEx depotHeadMapperEx;
|
@Resource
|
private UserService userService;
|
@Resource
|
private RoleService roleService;
|
@Resource
|
private DepotService depotService;
|
@Resource
|
DepotItemService depotItemService;
|
@Resource
|
private SupplierService supplierService;
|
@Resource
|
private UserBusinessService userBusinessService;
|
@Resource
|
private SystemConfigService systemConfigService;
|
@Resource
|
private SerialNumberService serialNumberService;
|
@Resource
|
private OrgaUserRelService orgaUserRelService;
|
@Resource
|
private PersonService personService;
|
@Resource
|
private AccountService accountService;
|
@Resource
|
private AccountHeadService accountHeadService;
|
@Resource
|
private AccountItemService accountItemService;
|
@Resource
|
private SequenceService sequenceService;
|
@Resource
|
DepotItemMapperEx depotItemMapperEx;
|
@Resource
|
private LogService logService;
|
|
public DepotHead getDepotHead(long id)throws Exception {
|
DepotHead result=null;
|
try{
|
result=depotHeadMapper.selectByPrimaryKey(id);
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return result;
|
}
|
|
public List<DepotHead> getDepotHead()throws Exception {
|
DepotHeadExample example = new DepotHeadExample();
|
example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
|
List<DepotHead> list=null;
|
try{
|
list=depotHeadMapper.selectByExample(example);
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return list;
|
}
|
|
public List<DepotHeadVo4List> select(String type, String subType, String hasDebt, String status, String purchaseStatus, String number, String linkApply, String linkNumber,
|
String beginTime, String endTime, String materialParam, Long organId, Long creator, Long depotId, Long accountId, String remark, int offset, int rows) throws Exception {
|
List<DepotHeadVo4List> resList = new ArrayList<>();
|
try{
|
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
|
Long userId = userService.getUserId(request);
|
String priceLimit = userService.getRoleTypeByUserId(userId).getPriceLimit();
|
String billCategory = getBillCategory(subType);
|
String [] depotArray = getDepotArray(subType);
|
String [] creatorArray = getCreatorArray();
|
String [] statusArray = StringUtil.isNotEmpty(status) ? status.split(",") : null;
|
String [] purchaseStatusArray = StringUtil.isNotEmpty(purchaseStatus) ? purchaseStatus.split(",") : null;
|
String [] organArray = getOrganArray(subType, purchaseStatus);
|
//以销定购,查看全部数据
|
creatorArray = StringUtil.isNotEmpty(purchaseStatus) ? null: creatorArray;
|
Map<Long,String> personMap = personService.getPersonMap();
|
Map<Long,String> accountMap = accountService.getAccountMap();
|
beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
|
endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
|
List<DepotHeadVo4List> list = depotHeadMapperEx.selectByConditionDepotHead(type, subType, creatorArray, hasDebt,
|
statusArray, purchaseStatusArray, number, linkApply, linkNumber, beginTime, endTime,
|
materialParam, organId, organArray, creator, depotId, depotArray, accountId, remark, offset, rows);
|
if (null != list) {
|
List<Long> idList = new ArrayList<>();
|
List<String> numberList = new ArrayList<>();
|
for (DepotHeadVo4List dh : list) {
|
idList.add(dh.getId());
|
numberList.add(dh.getNumber());
|
}
|
//通过批量查询去构造map
|
Map<String,BigDecimal> finishDepositMap = getFinishDepositMapByNumberList(numberList);
|
Map<Long,Integer> financialBillNoMap = getFinancialBillNoMapByBillIdList(idList);
|
Map<String,Integer> billSizeMap = getBillSizeMapByLinkNumberList(numberList);
|
Map<Long,String> materialsListMap = findMaterialsListMapByHeaderIdList(idList);
|
Map<Long,BigDecimal> materialCountListMap = getMaterialCountListMapByHeaderIdList(idList);
|
for (DepotHeadVo4List dh : list) {
|
if(accountMap!=null && StringUtil.isNotEmpty(dh.getAccountIdList()) && StringUtil.isNotEmpty(dh.getAccountMoneyList())) {
|
String accountStr = accountService.getAccountStrByIdAndMoney(accountMap, dh.getAccountIdList(), dh.getAccountMoneyList());
|
dh.setAccountName(accountStr);
|
}
|
if(dh.getAccountIdList() != null) {
|
String accountidlistStr = dh.getAccountIdList().replace("[", "").replace("]", "").replaceAll("\"", "");
|
dh.setAccountIdList(accountidlistStr);
|
}
|
if(dh.getAccountMoneyList() != null) {
|
String accountmoneylistStr = dh.getAccountMoneyList().replace("[", "").replace("]", "").replaceAll("\"", "");
|
dh.setAccountMoneyList(accountmoneylistStr);
|
}
|
if(dh.getChangeAmount() != null) {
|
dh.setChangeAmount(roleService.parseBillPriceByLimit(dh.getChangeAmount().abs(), billCategory, priceLimit, request));
|
} else {
|
dh.setChangeAmount(BigDecimal.ZERO);
|
}
|
if(dh.getTotalPrice() != null) {
|
BigDecimal lastTotalPrice = BusinessConstants.SUB_TYPE_CHECK_ENTER.equals(dh.getSubType())||
|
BusinessConstants.SUB_TYPE_REPLAY.equals(dh.getSubType())?dh.getTotalPrice():dh.getTotalPrice().abs();
|
dh.setTotalPrice(roleService.parseBillPriceByLimit(lastTotalPrice, billCategory, priceLimit, request));
|
}
|
BigDecimal discountLastMoney = dh.getDiscountLastMoney()!=null?dh.getDiscountLastMoney():BigDecimal.ZERO;
|
dh.setDiscountLastMoney(roleService.parseBillPriceByLimit(discountLastMoney, billCategory, priceLimit, request));
|
BigDecimal backAmount = dh.getBackAmount()!=null?dh.getBackAmount():BigDecimal.ZERO;
|
dh.setBackAmount(roleService.parseBillPriceByLimit(backAmount, billCategory, priceLimit, request));
|
if(dh.getDeposit() == null) {
|
dh.setDeposit(BigDecimal.ZERO);
|
} else {
|
dh.setDeposit(roleService.parseBillPriceByLimit(dh.getDeposit(), billCategory, priceLimit, request));
|
}
|
//已经完成的欠款
|
if(finishDepositMap!=null) {
|
BigDecimal finishDeposit = finishDepositMap.get(dh.getNumber()) != null ? finishDepositMap.get(dh.getNumber()) : BigDecimal.ZERO;
|
dh.setFinishDeposit(roleService.parseBillPriceByLimit(finishDeposit, billCategory, priceLimit, request));
|
}
|
//欠款计算
|
BigDecimal otherMoney = dh.getOtherMoney()!=null?dh.getOtherMoney():BigDecimal.ZERO;
|
BigDecimal deposit = dh.getDeposit()!=null?dh.getDeposit():BigDecimal.ZERO;
|
BigDecimal changeAmount = dh.getChangeAmount()!=null?dh.getChangeAmount():BigDecimal.ZERO;
|
BigDecimal debt = discountLastMoney.add(otherMoney).subtract((deposit.add(changeAmount)));
|
dh.setDebt(roleService.parseBillPriceByLimit(debt, billCategory, priceLimit, request));
|
//是否有付款单或收款单
|
if(financialBillNoMap!=null) {
|
Integer financialBillNoSize = financialBillNoMap.get(dh.getId());
|
dh.setHasFinancialFlag(financialBillNoSize!=null && financialBillNoSize>0);
|
}
|
//是否有退款单
|
if(billSizeMap!=null) {
|
Integer billListSize = billSizeMap.get(dh.getNumber());
|
dh.setHasBackFlag(billListSize!=null && billListSize>0);
|
}
|
if(StringUtil.isNotEmpty(dh.getSalesMan())) {
|
dh.setSalesManStr(personService.getPersonByMapAndIds(personMap,dh.getSalesMan()));
|
}
|
if(dh.getOperTime() != null) {
|
dh.setOperTimeStr(getCenternTime(dh.getOperTime()));
|
}
|
//商品信息简述
|
if(materialsListMap!=null) {
|
dh.setMaterialsList(materialsListMap.get(dh.getId()));
|
}
|
//商品总数量
|
if(materialCountListMap!=null) {
|
dh.setMaterialCount(materialCountListMap.get(dh.getId()));
|
}
|
//以销定购的情况(不能显示销售单据的金额和客户名称)
|
if(StringUtil.isNotEmpty(purchaseStatus)) {
|
dh.setOrganName("****");
|
dh.setTotalPrice(null);
|
dh.setDiscountLastMoney(null);
|
}
|
resList.add(dh);
|
}
|
}
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return resList;
|
}
|
|
public Long countDepotHead(String type, String subType, String hasDebt, String status, String purchaseStatus, String number, String linkApply, String linkNumber,
|
String beginTime, String endTime, String materialParam, Long organId, Long creator, Long depotId, Long accountId, String remark) throws Exception{
|
Long result=null;
|
try{
|
String [] depotArray = getDepotArray(subType);
|
String [] creatorArray = getCreatorArray();
|
String [] statusArray = StringUtil.isNotEmpty(status) ? status.split(",") : null;
|
String [] purchaseStatusArray = StringUtil.isNotEmpty(purchaseStatus) ? purchaseStatus.split(",") : null;
|
String [] organArray = getOrganArray(subType, purchaseStatus);
|
//以销定购,查看全部数据
|
creatorArray = StringUtil.isNotEmpty(purchaseStatus) ? null: creatorArray;
|
beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
|
endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
|
result=depotHeadMapperEx.countsByDepotHead(type, subType, creatorArray, hasDebt,
|
statusArray, purchaseStatusArray, number, linkApply, linkNumber, beginTime, endTime,
|
materialParam, organId, organArray, creator, depotId, depotArray, accountId, remark);
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return result;
|
}
|
|
/**
|
* 根据单据类型获取仓库数组
|
* @param subType
|
* @return
|
* @throws Exception
|
*/
|
public String[] getDepotArray(String subType) throws Exception {
|
String [] depotArray = null;
|
if(!BusinessConstants.SUB_TYPE_PURCHASE_APPLY.equals(subType)
|
&& !BusinessConstants.SUB_TYPE_PURCHASE_ORDER.equals(subType)
|
&& !BusinessConstants.SUB_TYPE_SALES_ORDER.equals(subType)) {
|
String depotIds = depotService.findDepotStrByCurrentUser();
|
depotArray = StringUtil.isNotEmpty(depotIds) ? depotIds.split(",") : null;
|
}
|
return depotArray;
|
}
|
|
/**
|
* 根据角色类型获取操作员数组
|
* @return
|
* @throws Exception
|
*/
|
public String[] getCreatorArray() throws Exception {
|
String creator = getCreatorByCurrentUser();
|
String [] creatorArray=null;
|
if(StringUtil.isNotEmpty(creator)){
|
creatorArray = creator.split(",");
|
}
|
return creatorArray;
|
}
|
|
/**
|
* 根据角色类型获取操作员数组
|
* @param organizationId
|
* @return
|
* @throws Exception
|
*/
|
public String[] getCreatorArrayByOrg(Long organizationId) throws Exception {
|
List<Long> userIdList = orgaUserRelService.getUserIdListByOrgId(organizationId);
|
if(userIdList.size()>0) {
|
List<String> userIdStrList = userIdList.stream().map(Object::toString).collect(Collectors.toList());
|
return StringUtil.listToStringArray(userIdStrList);
|
} else {
|
return "-1".split(",");
|
}
|
}
|
|
/**
|
* 获取机构数组
|
* @return
|
*/
|
public String[] getOrganArray(String subType, String purchaseStatus) throws Exception {
|
String [] organArray = null;
|
String type = "UserCustomer";
|
Long userId = userService.getCurrentUser().getId();
|
//获取权限信息
|
String ubValue = userBusinessService.getUBValueByTypeAndKeyId(type, userId.toString());
|
List<Supplier> supplierList = supplierService.findBySelectCus();
|
if(BusinessConstants.SUB_TYPE_SALES_ORDER.equals(subType) || BusinessConstants.SUB_TYPE_SALES.equals(subType)
|
||BusinessConstants.SUB_TYPE_SALES_RETURN.equals(subType) ) {
|
//采购订单里面选择销售订单的时候不要过滤
|
if(StringUtil.isEmpty(purchaseStatus)) {
|
if (null != supplierList && supplierList.size() > 0) {
|
boolean customerFlag = systemConfigService.getCustomerFlag();
|
List<String> organList = new ArrayList<>();
|
for (Supplier supplier : supplierList) {
|
boolean flag = ubValue.contains("[" + supplier.getId().toString() + "]");
|
if (!customerFlag || flag) {
|
organList.add(supplier.getId().toString());
|
}
|
}
|
if(organList.size() > 0) {
|
organArray = StringUtil.listToStringArray(organList);
|
}
|
}
|
}
|
}
|
return organArray;
|
}
|
|
/**
|
* 根据角色类型获取操作员
|
* @return
|
* @throws Exception
|
*/
|
public String getCreatorByCurrentUser() throws Exception {
|
String creator = "";
|
User user = userService.getCurrentUser();
|
String roleType = userService.getRoleTypeByUserId(user.getId()).getType(); //角色类型
|
if(BusinessConstants.ROLE_TYPE_PRIVATE.equals(roleType)) {
|
creator = user.getId().toString();
|
} else if(BusinessConstants.ROLE_TYPE_THIS_ORG.equals(roleType)) {
|
creator = orgaUserRelService.getUserIdListByUserId(user.getId());
|
}
|
return creator;
|
}
|
|
public Map<String, BigDecimal> getFinishDepositMapByNumberList(List<String> numberList) {
|
Map<String,BigDecimal> finishDepositMap = new HashMap<>();
|
if(numberList.size()>0) {
|
List<FinishDepositVo> list = depotHeadMapperEx.getFinishDepositByNumberList(numberList);
|
if(list!=null && list.size()>0) {
|
for (FinishDepositVo finishDepositVo : list) {
|
if(finishDepositVo!=null) {
|
finishDepositMap.put(finishDepositVo.getNumber(), finishDepositVo.getFinishDeposit());
|
}
|
}
|
}
|
}
|
return finishDepositMap;
|
}
|
|
public Map<String, Integer> getBillSizeMapByLinkNumberList(List<String> numberList) throws Exception {
|
Map<String, Integer> billListMap = new HashMap<>();
|
if(numberList.size()>0) {
|
List<DepotHead> list = getBillListByLinkNumberList(numberList);
|
if(list!=null && list.size()>0) {
|
for (DepotHead depotHead : list) {
|
if(depotHead!=null) {
|
billListMap.put(depotHead.getLinkNumber(), list.size());
|
}
|
}
|
}
|
}
|
return billListMap;
|
}
|
|
public Map<Long,Integer> getFinancialBillNoMapByBillIdList(List<Long> idList) {
|
Map<Long, Integer> billListMap = new HashMap<>();
|
if(idList.size()>0) {
|
List<AccountItem> list = accountHeadService.getFinancialBillNoByBillIdList(idList);
|
if(list!=null && list.size()>0) {
|
for (AccountItem accountItem : list) {
|
if(accountItem!=null) {
|
billListMap.put(accountItem.getBillId(), list.size());
|
}
|
}
|
}
|
}
|
return billListMap;
|
}
|
|
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
|
public int insertDepotHead(JSONObject obj, HttpServletRequest request)throws Exception {
|
DepotHead depotHead = JSONObject.parseObject(obj.toJSONString(), DepotHead.class);
|
depotHead.setCreateTime(new Timestamp(System.currentTimeMillis()));
|
depotHead.setStatus(BusinessConstants.BILLS_STATUS_UN_AUDIT);
|
int result=0;
|
try{
|
result=depotHeadMapper.insert(depotHead);
|
logService.insertLog("单据", BusinessConstants.LOG_OPERATION_TYPE_ADD, request);
|
}catch(Exception e){
|
JshException.writeFail(logger, e);
|
}
|
return result;
|
}
|
|
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
|
public int updateDepotHead(JSONObject obj, HttpServletRequest request) throws Exception{
|
DepotHead depotHead = JSONObject.parseObject(obj.toJSONString(), DepotHead.class);
|
DepotHead dh=null;
|
try{
|
dh = depotHeadMapper.selectByPrimaryKey(depotHead.getId());
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
depotHead.setStatus(dh.getStatus());
|
depotHead.setCreateTime(dh.getCreateTime());
|
int result=0;
|
try{
|
result = depotHeadMapper.updateByPrimaryKey(depotHead);
|
logService.insertLog("单据",
|
new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(depotHead.getId()).toString(), request);
|
}catch(Exception e){
|
JshException.writeFail(logger, e);
|
}
|
return result;
|
}
|
|
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
|
public int deleteDepotHead(Long id, HttpServletRequest request)throws Exception {
|
return batchDeleteBillByIds(id.toString());
|
}
|
|
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
|
public int batchDeleteDepotHead(String ids, HttpServletRequest request)throws Exception {
|
return batchDeleteBillByIds(ids);
|
}
|
|
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
|
public int batchDeleteBillByIds(String ids)throws Exception {
|
StringBuffer sb = new StringBuffer();
|
sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
|
List<DepotHead> dhList = getDepotHeadListByIds(ids);
|
for(DepotHead depotHead: dhList){
|
//只有未审核的单据才能被删除
|
if(!"0".equals(depotHead.getStatus())) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_UN_AUDIT_DELETE_FAILED_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_UN_AUDIT_DELETE_FAILED_MSG));
|
}
|
}
|
for(DepotHead depotHead: dhList){
|
sb.append("[").append(depotHead.getNumber()).append("]");
|
User userInfo = userService.getCurrentUser();
|
//删除入库单据,先校验序列号是否出库,如果未出库则同时删除序列号,如果已出库则不能删除单据
|
if (BusinessConstants.DEPOTHEAD_TYPE_IN.equals(depotHead.getType())) {
|
List<DepotItem> depotItemList = depotItemMapperEx.findDepotItemListBydepotheadId(depotHead.getId(), BusinessConstants.ENABLE_SERIAL_NUMBER_ENABLED);
|
if (depotItemList != null && depotItemList.size() > 0) {
|
//单据明细里面存在序列号商品
|
int serialNumberSellCount = depotHeadMapperEx.getSerialNumberBySell(depotHead.getNumber());
|
if (serialNumberSellCount > 0) {
|
//已出库则不能删除单据
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_SERIAL_IS_SELL_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_SERIAL_IS_SELL_MSG, depotHead.getNumber()));
|
} else {
|
//删除序列号
|
SerialNumberExample example = new SerialNumberExample();
|
example.createCriteria().andInBillNoEqualTo(depotHead.getNumber());
|
serialNumberService.deleteByExample(example);
|
}
|
}
|
}
|
//删除出库数据回收序列号
|
if (BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType())
|
&& !BusinessConstants.SUB_TYPE_TRANSFER.equals(depotHead.getSubType())) {
|
//查询单据子表列表
|
List<DepotItem> depotItemList = depotItemMapperEx.findDepotItemListBydepotheadId(depotHead.getId(), BusinessConstants.ENABLE_SERIAL_NUMBER_ENABLED);
|
/**回收序列号*/
|
if (depotItemList != null && depotItemList.size() > 0) {
|
for (DepotItem depotItem : depotItemList) {
|
//BasicNumber=OperNumber*ratio
|
serialNumberService.cancelSerialNumber(depotItem.getMaterialId(), depotHead.getNumber(), (depotItem.getBasicNumber() == null ? 0 : depotItem.getBasicNumber()).intValue(), userInfo);
|
}
|
}
|
}
|
List<DepotItem> list = depotItemService.getListByHeaderId(depotHead.getId());
|
//删除单据子表数据
|
depotItemMapperEx.batchDeleteDepotItemByDepotHeadIds(new Long[]{depotHead.getId()});
|
//删除单据主表信息
|
batchDeleteDepotHeadByIds(depotHead.getId().toString());
|
//将关联的单据置为审核状态-针对采购入库、销售出库、盘点复盘、其它入库、其它出库
|
if(StringUtil.isNotEmpty(depotHead.getLinkNumber())){
|
if((BusinessConstants.DEPOTHEAD_TYPE_IN.equals(depotHead.getType()) &&
|
BusinessConstants.SUB_TYPE_PURCHASE.equals(depotHead.getSubType()))
|
|| (BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType()) &&
|
BusinessConstants.SUB_TYPE_SALES.equals(depotHead.getSubType()))
|
|| (BusinessConstants.DEPOTHEAD_TYPE_OTHER.equals(depotHead.getType()) &&
|
BusinessConstants.SUB_TYPE_REPLAY.equals(depotHead.getSubType()))
|
|| (BusinessConstants.DEPOTHEAD_TYPE_IN.equals(depotHead.getType()) &&
|
BusinessConstants.SUB_TYPE_OTHER.equals(depotHead.getSubType()))
|
|| (BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType()) &&
|
BusinessConstants.SUB_TYPE_OTHER.equals(depotHead.getSubType()))) {
|
String status = BusinessConstants.BILLS_STATUS_AUDIT;
|
//查询除当前单据之外的关联单据列表
|
List<DepotHead> exceptCurrentList = getListByLinkNumberExceptCurrent(depotHead.getLinkNumber(), depotHead.getNumber(), depotHead.getType());
|
if(exceptCurrentList!=null && exceptCurrentList.size()>0) {
|
status = BusinessConstants.BILLS_STATUS_SKIPING;
|
}
|
DepotHead dh = new DepotHead();
|
dh.setStatus(status);
|
DepotHeadExample example = new DepotHeadExample();
|
example.createCriteria().andNumberEqualTo(depotHead.getLinkNumber());
|
depotHeadMapper.updateByExampleSelective(dh, example);
|
}
|
}
|
//将关联的单据置为审核状态-针对请购单转采购订单的情况
|
if(StringUtil.isNotEmpty(depotHead.getLinkApply())){
|
if(BusinessConstants.DEPOTHEAD_TYPE_OTHER.equals(depotHead.getType()) &&
|
BusinessConstants.SUB_TYPE_PURCHASE_ORDER.equals(depotHead.getSubType())) {
|
String status = BusinessConstants.BILLS_STATUS_AUDIT;
|
//查询除当前单据之外的关联单据列表
|
List<DepotHead> exceptCurrentList = getListByLinkApplyExceptCurrent(depotHead.getLinkApply(), depotHead.getNumber(), depotHead.getType());
|
if(exceptCurrentList!=null && exceptCurrentList.size()>0) {
|
status = BusinessConstants.BILLS_STATUS_SKIPING;
|
}
|
DepotHead dh = new DepotHead();
|
dh.setStatus(status);
|
DepotHeadExample example = new DepotHeadExample();
|
example.createCriteria().andNumberEqualTo(depotHead.getLinkApply());
|
depotHeadMapper.updateByExampleSelective(dh, example);
|
}
|
}
|
//将关联的销售订单单据置为未采购状态-针对销售订单转采购订单的情况
|
if(StringUtil.isNotEmpty(depotHead.getLinkNumber())){
|
if(BusinessConstants.DEPOTHEAD_TYPE_OTHER.equals(depotHead.getType()) &&
|
BusinessConstants.SUB_TYPE_PURCHASE_ORDER.equals(depotHead.getSubType())) {
|
DepotHead dh = new DepotHead();
|
//获取分批操作后单据的商品和商品数量(汇总)
|
List<DepotItemVo4MaterialAndSum> batchList = depotItemMapperEx.getBatchBillDetailMaterialSum(depotHead.getLinkNumber(), "normal", depotHead.getType());
|
if(batchList.size()>0) {
|
dh.setPurchaseStatus(BusinessConstants.PURCHASE_STATUS_SKIPING);
|
} else {
|
dh.setPurchaseStatus(BusinessConstants.PURCHASE_STATUS_UN_AUDIT);
|
}
|
DepotHeadExample example = new DepotHeadExample();
|
example.createCriteria().andNumberEqualTo(depotHead.getLinkNumber());
|
depotHeadMapper.updateByExampleSelective(dh, example);
|
}
|
}
|
//对于零售出库单据,更新会员的预收款信息
|
if (BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType())
|
&& BusinessConstants.SUB_TYPE_RETAIL.equals(depotHead.getSubType())){
|
if(BusinessConstants.PAY_TYPE_PREPAID.equals(depotHead.getPayType())) {
|
if (depotHead.getOrganId() != null) {
|
//更新会员预付款
|
supplierService.updateAdvanceIn(depotHead.getOrganId());
|
}
|
}
|
}
|
for (DepotItem depotItem : list) {
|
//更新当前库存
|
depotItemService.updateCurrentStock(depotItem);
|
//更新当前成本价
|
depotItemService.updateCurrentUnitPrice(depotItem);
|
}
|
}
|
//路径列表
|
List<String> pathList = new ArrayList<>();
|
for(DepotHead depotHead: dhList){
|
if(StringUtil.isNotEmpty(depotHead.getFileName())) {
|
pathList.add(depotHead.getFileName());
|
}
|
}
|
//逻辑删除文件
|
systemConfigService.deleteFileByPathList(pathList);
|
logService.insertLog("单据", sb.toString(),
|
((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
|
return 1;
|
}
|
|
/**
|
* 删除单据主表信息
|
* @param ids
|
* @return
|
* @throws Exception
|
*/
|
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
|
public int batchDeleteDepotHeadByIds(String ids)throws Exception {
|
User userInfo=userService.getCurrentUser();
|
String [] idArray=ids.split(",");
|
int result=0;
|
try{
|
result = depotHeadMapperEx.batchDeleteDepotHeadByIds(new Date(),userInfo==null?null:userInfo.getId(),idArray);
|
}catch(Exception e){
|
JshException.writeFail(logger, e);
|
}
|
return result;
|
}
|
|
public List<DepotHead> getDepotHeadListByIds(String ids)throws Exception {
|
List<Long> idList = StringUtil.strToLongList(ids);
|
List<DepotHead> list = new ArrayList<>();
|
try{
|
DepotHeadExample example = new DepotHeadExample();
|
example.createCriteria().andIdIn(idList);
|
list = depotHeadMapper.selectByExample(example);
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return list;
|
}
|
|
/**
|
* 校验单据编号是否存在
|
* @param id
|
* @param number
|
* @return
|
* @throws Exception
|
*/
|
public int checkIsBillNumberExist(Long id, String number)throws Exception {
|
DepotHeadExample example = new DepotHeadExample();
|
example.createCriteria().andIdNotEqualTo(id).andNumberEqualTo(number).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
|
List<DepotHead> list = null;
|
try{
|
list = depotHeadMapper.selectByExample(example);
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return list==null?0:list.size();
|
}
|
|
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
|
public int batchSetStatus(String status, String depotHeadIDs)throws Exception {
|
int result = 0;
|
List<Long> dhIds = new ArrayList<>();
|
List<Long> ids = StringUtil.strToLongList(depotHeadIDs);
|
for(Long id: ids) {
|
DepotHead depotHead = getDepotHead(id);
|
if("0".equals(status)){
|
//进行反审核操作
|
if("1".equals(depotHead.getStatus()) && "0".equals(depotHead.getPurchaseStatus())) {
|
dhIds.add(id);
|
} else if("2".equals(depotHead.getPurchaseStatus())) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_PURCHASE_STATUS_TWO_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_PURCHASE_STATUS_TWO_MSG));
|
} else if("3".equals(depotHead.getPurchaseStatus())) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_PURCHASE_STATUS_THREE_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_PURCHASE_STATUS_THREE_MSG));
|
} else {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_AUDIT_TO_UN_AUDIT_FAILED_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_AUDIT_TO_UN_AUDIT_FAILED_MSG));
|
}
|
} else if("1".equals(status)){
|
//进行审核操作
|
if("0".equals(depotHead.getStatus())) {
|
dhIds.add(id);
|
} else {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_UN_AUDIT_TO_AUDIT_FAILED_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_UN_AUDIT_TO_AUDIT_FAILED_MSG));
|
}
|
}
|
}
|
if(dhIds.size()>0) {
|
DepotHead depotHead = new DepotHead();
|
depotHead.setStatus(status);
|
DepotHeadExample example = new DepotHeadExample();
|
example.createCriteria().andIdIn(dhIds);
|
result = depotHeadMapper.updateByExampleSelective(depotHead, example);
|
//更新当前库存
|
if(systemConfigService.getForceApprovalFlag()) {
|
for(Long dhId: dhIds) {
|
List<DepotItem> list = depotItemService.getListByHeaderId(dhId);
|
for (DepotItem depotItem : list) {
|
depotItemService.updateCurrentStock(depotItem);
|
}
|
}
|
}
|
}
|
return result;
|
}
|
|
public Map<Long,String> findMaterialsListMapByHeaderIdList(List<Long> idList)throws Exception {
|
Map<Long,String> materialsListMap = new HashMap<>();
|
if(idList.size()>0) {
|
List<MaterialsListVo> list = depotHeadMapperEx.findMaterialsListMapByHeaderIdList(idList);
|
for (MaterialsListVo materialsListVo : list) {
|
String materialsList = materialsListVo.getMaterialsList();
|
if(StringUtil.isNotEmpty(materialsList)) {
|
materialsList = materialsList.replace(",",",");
|
}
|
materialsListMap.put(materialsListVo.getHeaderId(), materialsList);
|
}
|
}
|
return materialsListMap;
|
}
|
|
public Map<Long,BigDecimal> getMaterialCountListMapByHeaderIdList(List<Long> idList)throws Exception {
|
Map<Long,BigDecimal> materialCountListMap = new HashMap<>();
|
if(idList.size()>0) {
|
List<MaterialCountVo> list = depotHeadMapperEx.getMaterialCountListByHeaderIdList(idList);
|
for(MaterialCountVo materialCountVo : list){
|
materialCountListMap.put(materialCountVo.getHeaderId(), materialCountVo.getMaterialCount());
|
}
|
}
|
return materialCountListMap;
|
}
|
|
public List<DepotHeadVo4InDetail> findInOutDetail(String beginTime, String endTime, String type, String[] creatorArray,
|
String[] organArray, List<Long> categoryList, Boolean forceFlag, Boolean inOutManageFlag,
|
String materialParam, List<Long> depotList, Integer oId, String number,
|
Long creator, String remark, String column, String order, Integer offset, Integer rows) throws Exception{
|
List<DepotHeadVo4InDetail> list = null;
|
try{
|
list =depotHeadMapperEx.findInOutDetail(beginTime, endTime, type, creatorArray, organArray, categoryList, forceFlag, inOutManageFlag,
|
materialParam, depotList, oId, number, creator, remark, column, order, offset, rows);
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return list;
|
}
|
|
public int findInOutDetailCount(String beginTime, String endTime, String type, String[] creatorArray,
|
String[] organArray, List<Long> categoryList, Boolean forceFlag, Boolean inOutManageFlag, String materialParam, List<Long> depotList, Integer oId, String number,
|
Long creator, String remark) throws Exception{
|
int result = 0;
|
try{
|
result =depotHeadMapperEx.findInOutDetailCount(beginTime, endTime, type, creatorArray, organArray, categoryList, forceFlag, inOutManageFlag,
|
materialParam, depotList, oId, number, creator, remark);
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return result;
|
}
|
|
public DepotHeadVo4InDetail findInOutDetailStatistic(String beginTime, String endTime, String type, String [] creatorArray,
|
String [] organArray, List<Long> categoryList, Boolean forceFlag, Boolean inOutManageFlag,
|
String materialParam, List<Long> depotList, Integer oId, String number,
|
Long creator, String remark) throws Exception{
|
DepotHeadVo4InDetail item = new DepotHeadVo4InDetail();
|
try{
|
List<DepotHeadVo4InDetail> list =depotHeadMapperEx.findInOutDetailStatistic(beginTime, endTime, type, creatorArray, organArray, categoryList, forceFlag, inOutManageFlag,
|
materialParam, depotList, oId, number, creator, remark);
|
if(list.size()>0) {
|
item.setOperNumber(list.get(0).getOperNumber());
|
item.setAllPrice(list.get(0).getAllPrice());
|
}
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return item;
|
}
|
|
public List<DepotHeadVo4InOutMCount> findInOutMaterialCount(String beginTime, String endTime, String type, List<Long> categoryList,
|
Boolean forceFlag, Boolean inOutManageFlag, String materialParam,
|
List<Long> depotList, Long organizationId, Integer oId, String column, String order,
|
Integer offset, Integer rows)throws Exception {
|
List<DepotHeadVo4InOutMCount> list = null;
|
try{
|
String [] creatorArray = getCreatorArray();
|
if(creatorArray == null && organizationId != null) {
|
creatorArray = getCreatorArrayByOrg(organizationId);
|
}
|
String subType = "出库".equals(type)? "销售" : "";
|
String [] organArray = getOrganArray(subType, "");
|
list =depotHeadMapperEx.findInOutMaterialCount(beginTime, endTime, type, categoryList, forceFlag, inOutManageFlag, materialParam, depotList, oId,
|
creatorArray, organArray, column, order, offset, rows);
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return list;
|
}
|
|
public int findInOutMaterialCountTotal(String beginTime, String endTime, String type, List<Long> categoryList,
|
Boolean forceFlag, Boolean inOutManageFlag, String materialParam,
|
List<Long> depotList, Long organizationId, Integer oId)throws Exception {
|
int result = 0;
|
try{
|
String [] creatorArray = getCreatorArray();
|
if(creatorArray == null && organizationId != null) {
|
creatorArray = getCreatorArrayByOrg(organizationId);
|
}
|
String subType = "出库".equals(type)? "销售" : "";
|
String [] organArray = getOrganArray(subType, "");
|
result =depotHeadMapperEx.findInOutMaterialCountTotal(beginTime, endTime, type, categoryList, forceFlag, inOutManageFlag, materialParam, depotList, oId,
|
creatorArray, organArray);
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return result;
|
}
|
|
public DepotHeadVo4InOutMCount findInOutMaterialCountStatistic(String beginTime, String endTime, String type, List<Long> categoryList,
|
Boolean forceFlag, Boolean inOutManageFlag, String materialParam,
|
List<Long> depotList, Long organizationId, Integer oId) throws Exception {
|
DepotHeadVo4InOutMCount item = new DepotHeadVo4InOutMCount();
|
try{
|
String [] creatorArray = getCreatorArray();
|
if(creatorArray == null && organizationId != null) {
|
creatorArray = getCreatorArrayByOrg(organizationId);
|
}
|
String subType = "出库".equals(type)? "销售" : "";
|
String [] organArray = getOrganArray(subType, "");
|
List<DepotHeadVo4InOutMCount> list = depotHeadMapperEx.findInOutMaterialCountStatistic(beginTime, endTime, type, categoryList,
|
forceFlag, inOutManageFlag, materialParam, depotList, oId, creatorArray, organArray);
|
if(list.size()>0) {
|
item.setNumSum(list.get(0).getNumSum());
|
item.setPriceSum(list.get(0).getPriceSum());
|
}
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return item;
|
}
|
|
public List<DepotHeadVo4InDetail> findAllocationDetail(String beginTime, String endTime, String subType, String number,
|
String [] creatorArray, List<Long> categoryList, Boolean forceFlag, String materialParam, List<Long> depotList, List<Long> depotFList,
|
String remark, String column, String order, Integer offset, Integer rows) throws Exception{
|
List<DepotHeadVo4InDetail> list = null;
|
try{
|
list =depotHeadMapperEx.findAllocationDetail(beginTime, endTime, subType, number, creatorArray, categoryList, forceFlag,
|
materialParam, depotList, depotFList, remark, column, order, offset, rows);
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return list;
|
}
|
|
public int findAllocationDetailCount(String beginTime, String endTime, String subType, String number,
|
String [] creatorArray, List<Long> categoryList, Boolean forceFlag, String materialParam, List<Long> depotList, List<Long> depotFList,
|
String remark) throws Exception{
|
int result = 0;
|
try{
|
result =depotHeadMapperEx.findAllocationDetailCount(beginTime, endTime, subType, number, creatorArray, categoryList, forceFlag,
|
materialParam, depotList, depotFList, remark);
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return result;
|
}
|
|
public DepotHeadVo4InDetail findAllocationStatistic(String beginTime, String endTime, String subType, String number,
|
String [] creatorArray, List<Long> categoryList, Boolean forceFlag, String materialParam, List<Long> depotList, List<Long> depotFList,
|
String remark) throws Exception{
|
DepotHeadVo4InDetail item = new DepotHeadVo4InDetail();
|
try{
|
List<DepotHeadVo4InDetail> list =depotHeadMapperEx.findAllocationStatistic(beginTime, endTime, subType, number, creatorArray, categoryList, forceFlag,
|
materialParam, depotList, depotFList, remark);
|
if(list.size()>0) {
|
item.setOperNumber(list.get(0).getOperNumber());
|
item.setAllPrice(list.get(0).getAllPrice());
|
}
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return item;
|
}
|
|
public List<DepotHeadVo4StatementAccount> getStatementAccount(String beginTime, String endTime, Integer organId, String [] organArray,
|
Integer hasDebt, String supplierType, String type, String subType, String typeBack,
|
String subTypeBack, String billType, Integer offset, Integer rows) {
|
List<DepotHeadVo4StatementAccount> list = null;
|
try{
|
list = depotHeadMapperEx.getStatementAccount(beginTime, endTime, organId, organArray, hasDebt, supplierType, type, subType,typeBack, subTypeBack, billType, offset, rows);
|
} catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return list;
|
}
|
|
public int getStatementAccountCount(String beginTime, String endTime, Integer organId, String [] organArray,
|
Integer hasDebt, String supplierType, String type, String subType, String typeBack, String subTypeBack, String billType) {
|
int result = 0;
|
try{
|
result = depotHeadMapperEx.getStatementAccountCount(beginTime, endTime, organId, organArray, hasDebt, supplierType, type, subType,typeBack, subTypeBack, billType);
|
} catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return result;
|
}
|
|
public List<DepotHeadVo4StatementAccount> getStatementAccountTotalPay(String beginTime, String endTime, Integer organId, String [] organArray,
|
Integer hasDebt, String supplierType, String type, String subType,
|
String typeBack, String subTypeBack, String billType) {
|
List<DepotHeadVo4StatementAccount> list = null;
|
try{
|
list = depotHeadMapperEx.getStatementAccountTotalPay(beginTime, endTime, organId, organArray, hasDebt, supplierType, type, subType,typeBack, subTypeBack, billType);
|
} catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return list;
|
}
|
|
public List<DepotHeadVo4List> getDetailByNumber(String number, HttpServletRequest request)throws Exception {
|
List<DepotHeadVo4List> resList = new ArrayList<>();
|
try{
|
Long userId = userService.getUserId(request);
|
String priceLimit = userService.getRoleTypeByUserId(userId).getPriceLimit();
|
Map<Long,String> personMap = personService.getPersonMap();
|
Map<Long,String> accountMap = accountService.getAccountMap();
|
List<DepotHeadVo4List> list = depotHeadMapperEx.getDetailByNumber(number);
|
if (null != list) {
|
List<Long> idList = new ArrayList<>();
|
List<String> numberList = new ArrayList<>();
|
for (DepotHeadVo4List dh : list) {
|
idList.add(dh.getId());
|
numberList.add(dh.getNumber());
|
}
|
//通过批量查询去构造map
|
Map<Long,Integer> financialBillNoMap = getFinancialBillNoMapByBillIdList(idList);
|
Map<String,Integer> billSizeMap = getBillSizeMapByLinkNumberList(numberList);
|
Map<Long,String> materialsListMap = findMaterialsListMapByHeaderIdList(idList);
|
DepotHeadVo4List dh = list.get(0);
|
String billCategory = getBillCategory(dh.getSubType());
|
if(accountMap!=null && StringUtil.isNotEmpty(dh.getAccountIdList()) && StringUtil.isNotEmpty(dh.getAccountMoneyList())) {
|
String accountStr = accountService.getAccountStrByIdAndMoney(accountMap, dh.getAccountIdList(), dh.getAccountMoneyList());
|
dh.setAccountName(accountStr);
|
}
|
if(dh.getAccountIdList() != null) {
|
String accountidlistStr = dh.getAccountIdList().replace("[", "").replace("]", "").replaceAll("\"", "");
|
dh.setAccountIdList(accountidlistStr);
|
}
|
if(dh.getAccountMoneyList() != null) {
|
String accountmoneylistStr = dh.getAccountMoneyList().replace("[", "").replace("]", "").replaceAll("\"", "");
|
dh.setAccountMoneyList(accountmoneylistStr);
|
}
|
if(dh.getChangeAmount() != null) {
|
dh.setChangeAmount(roleService.parseBillPriceByLimit(dh.getChangeAmount().abs(), billCategory, priceLimit, request));
|
} else {
|
dh.setChangeAmount(BigDecimal.ZERO);
|
}
|
if(dh.getTotalPrice() != null) {
|
dh.setTotalPrice(roleService.parseBillPriceByLimit(dh.getTotalPrice().abs(), billCategory, priceLimit, request));
|
}
|
BigDecimal discountLastMoney = dh.getDiscountLastMoney()!=null?dh.getDiscountLastMoney():BigDecimal.ZERO;
|
dh.setDiscountLastMoney(roleService.parseBillPriceByLimit(discountLastMoney, billCategory, priceLimit, request));
|
BigDecimal backAmount = dh.getBackAmount()!=null?dh.getBackAmount():BigDecimal.ZERO;
|
dh.setBackAmount(roleService.parseBillPriceByLimit(backAmount, billCategory, priceLimit, request));
|
if(dh.getDeposit() == null) {
|
dh.setDeposit(BigDecimal.ZERO);
|
} else {
|
dh.setDeposit(roleService.parseBillPriceByLimit(dh.getDeposit(), billCategory, priceLimit, request));
|
}
|
//欠款计算
|
BigDecimal otherMoney = dh.getOtherMoney()!=null?dh.getOtherMoney():BigDecimal.ZERO;
|
BigDecimal deposit = dh.getDeposit()!=null?dh.getDeposit():BigDecimal.ZERO;
|
BigDecimal changeAmount = dh.getChangeAmount()!=null?dh.getChangeAmount():BigDecimal.ZERO;
|
BigDecimal debt = discountLastMoney.add(otherMoney).subtract((deposit.add(changeAmount)));
|
dh.setDebt(roleService.parseBillPriceByLimit(debt, billCategory, priceLimit, request));
|
//是否有付款单或收款单
|
if(financialBillNoMap!=null) {
|
Integer financialBillNoSize = financialBillNoMap.get(dh.getId());
|
dh.setHasFinancialFlag(financialBillNoSize!=null && financialBillNoSize>0);
|
}
|
//是否有退款单
|
if(billSizeMap!=null) {
|
Integer billListSize = billSizeMap.get(dh.getNumber());
|
dh.setHasBackFlag(billListSize!=null && billListSize>0);
|
}
|
if(StringUtil.isNotEmpty(dh.getSalesMan())) {
|
dh.setSalesManStr(personService.getPersonByMapAndIds(personMap,dh.getSalesMan()));
|
}
|
if(dh.getOperTime() != null) {
|
dh.setOperTimeStr(getCenternTime(dh.getOperTime()));
|
}
|
//商品信息简述
|
if(materialsListMap!=null) {
|
dh.setMaterialsList(materialsListMap.get(dh.getId()));
|
}
|
dh.setCreatorName(userService.getUser(dh.getCreator()).getUsername());
|
resList.add(dh);
|
}
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return resList;
|
}
|
|
/**
|
* 查询除当前单据之外的关联单据列表
|
* @param linkNumber
|
* @param number
|
* @return
|
* @throws Exception
|
*/
|
public List<DepotHead> getListByLinkNumberExceptCurrent(String linkNumber, String number, String type)throws Exception {
|
DepotHeadExample example = new DepotHeadExample();
|
example.createCriteria().andLinkNumberEqualTo(linkNumber).andNumberNotEqualTo(number).andTypeEqualTo(type)
|
.andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
|
return depotHeadMapper.selectByExample(example);
|
}
|
|
/**
|
* 查询除当前单据之外的关联单据列表
|
* @param linkApply
|
* @param number
|
* @return
|
* @throws Exception
|
*/
|
public List<DepotHead> getListByLinkApplyExceptCurrent(String linkApply, String number, String type)throws Exception {
|
DepotHeadExample example = new DepotHeadExample();
|
example.createCriteria().andLinkApplyEqualTo(linkApply).andNumberNotEqualTo(number).andTypeEqualTo(type)
|
.andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
|
return depotHeadMapper.selectByExample(example);
|
}
|
|
/**
|
* 根据原单号查询关联的单据列表(批量)
|
* @param linkNumberList
|
* @return
|
* @throws Exception
|
*/
|
public List<DepotHead> getBillListByLinkNumberList(List<String> linkNumberList)throws Exception {
|
if(linkNumberList!=null && linkNumberList.size()>0) {
|
DepotHeadExample example = new DepotHeadExample();
|
example.createCriteria().andLinkNumberIn(linkNumberList).andSubTypeLike("退货").andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
|
return depotHeadMapper.selectByExample(example);
|
} else {
|
return new ArrayList<>();
|
}
|
}
|
|
/**
|
* 根据原单号查询关联的单据列表
|
* @param linkNumber
|
* @return
|
* @throws Exception
|
*/
|
public List<DepotHead> getBillListByLinkNumber(String linkNumber)throws Exception {
|
DepotHeadExample example = new DepotHeadExample();
|
example.createCriteria().andLinkNumberEqualTo(linkNumber).andSubTypeLike("退货").andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
|
return depotHeadMapper.selectByExample(example);
|
}
|
|
/**
|
* 新增单据主表及单据子表信息
|
* @param beanJson
|
* @param rows
|
* @param request
|
* @throws Exception
|
*/
|
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
|
public void addDepotHeadAndDetail(String beanJson, String rows,
|
HttpServletRequest request) throws Exception {
|
/**处理单据主表数据*/
|
DepotHead depotHead = JSONObject.parseObject(beanJson, DepotHead.class);
|
//校验单号是否重复
|
if(checkIsBillNumberExist(0L, depotHead.getNumber())>0) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_BILL_NUMBER_EXIST_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_BILL_NUMBER_EXIST_MSG));
|
}
|
//校验是否同时录入关联请购单号和关联订单号
|
if(StringUtil.isNotEmpty(depotHead.getLinkNumber()) && StringUtil.isNotEmpty(depotHead.getLinkApply())) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_EXIST_REPEAT_NO_FAILED_CODE,
|
String.format(ExceptionConstants.DEPOT_ITEM_EXIST_REPEAT_NO_FAILED_MSG));
|
}
|
String subType = depotHead.getSubType();
|
//结算账户校验
|
if("采购".equals(subType) || "采购退货".equals(subType) || "销售".equals(subType) || "销售退货".equals(subType)) {
|
if (StringUtil.isEmpty(depotHead.getAccountIdList()) && depotHead.getAccountId() == null) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_ACCOUNT_FAILED_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_ACCOUNT_FAILED_MSG));
|
}
|
}
|
//判断用户是否已经登录过,登录过不再处理
|
User userInfo=userService.getCurrentUser();
|
depotHead.setCreator(userInfo==null?null:userInfo.getId());
|
depotHead.setCreateTime(new Timestamp(System.currentTimeMillis()));
|
if(StringUtil.isEmpty(depotHead.getStatus())) {
|
depotHead.setStatus(BusinessConstants.BILLS_STATUS_UN_AUDIT);
|
}
|
depotHead.setPurchaseStatus(BusinessConstants.BILLS_STATUS_UN_AUDIT);
|
depotHead.setPayType(depotHead.getPayType()==null?"现付":depotHead.getPayType());
|
if(StringUtil.isNotEmpty(depotHead.getAccountIdList())){
|
depotHead.setAccountIdList(depotHead.getAccountIdList().replace("[", "").replace("]", "").replaceAll("\"", ""));
|
}
|
if(StringUtil.isNotEmpty(depotHead.getAccountMoneyList())) {
|
//校验多账户的结算金额
|
String accountMoneyList = depotHead.getAccountMoneyList().replace("[", "").replace("]", "").replaceAll("\"", "");
|
BigDecimal sum = StringUtil.getArrSum(accountMoneyList.split(","));
|
BigDecimal manyAccountSum = sum.abs();
|
if(manyAccountSum.compareTo(depotHead.getChangeAmount().abs())!=0) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_MANY_ACCOUNT_FAILED_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_MANY_ACCOUNT_FAILED_MSG));
|
}
|
depotHead.setAccountMoneyList(accountMoneyList);
|
}
|
//校验累计扣除订金是否超出订单中的金额
|
if(depotHead.getDeposit()!=null && StringUtil.isNotEmpty(depotHead.getLinkNumber())) {
|
BigDecimal finishDeposit = depotHeadMapperEx.getFinishDepositByNumberExceptCurrent(depotHead.getLinkNumber(), depotHead.getNumber());
|
//订单中的订金金额
|
BigDecimal changeAmount = getDepotHead(depotHead.getLinkNumber()).getChangeAmount();
|
if(changeAmount!=null) {
|
BigDecimal preDeposit = changeAmount.abs();
|
if(depotHead.getDeposit().add(finishDeposit).compareTo(preDeposit)>0) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_DEPOSIT_OVER_PRE_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_DEPOSIT_OVER_PRE_MSG));
|
}
|
}
|
}
|
//校验附件的数量
|
if(StringUtil.isNotEmpty(depotHead.getFileName())) {
|
String[] fileArr = depotHead.getFileName().split(",");
|
if(fileArr.length>4) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_FILE_NUM_LIMIT_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_FILE_NUM_LIMIT_MSG, 4));
|
}
|
}
|
depotHeadMapper.insertSelective(depotHead);
|
/**入库和出库处理预付款信息*/
|
if(BusinessConstants.PAY_TYPE_PREPAID.equals(depotHead.getPayType())){
|
if(depotHead.getOrganId()!=null) {
|
BigDecimal currentAdvanceIn = supplierService.getSupplier(depotHead.getOrganId()).getAdvanceIn();
|
if(currentAdvanceIn.compareTo(depotHead.getTotalPrice())>=0) {
|
//更新会员的预付款
|
supplierService.updateAdvanceIn(depotHead.getOrganId());
|
} else {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_MEMBER_PAY_LACK_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_MEMBER_PAY_LACK_MSG));
|
}
|
}
|
}
|
//根据单据编号查询单据id
|
DepotHeadExample dhExample = new DepotHeadExample();
|
dhExample.createCriteria().andNumberEqualTo(depotHead.getNumber()).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
|
List<DepotHead> list = depotHeadMapper.selectByExample(dhExample);
|
if(list!=null) {
|
Long headId = list.get(0).getId();
|
/**入库和出库处理单据子表信息*/
|
depotItemService.saveDetials(rows,headId, "add",request);
|
}
|
logService.insertLog("单据",
|
new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(depotHead.getNumber()).toString(),
|
((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
|
}
|
|
/**
|
* 更新单据主表及单据子表信息
|
* @param beanJson
|
* @param rows
|
* @param request
|
* @throws Exception
|
*/
|
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
|
public void updateDepotHeadAndDetail(String beanJson, String rows,HttpServletRequest request)throws Exception {
|
/**更新单据主表信息*/
|
DepotHead depotHead = JSONObject.parseObject(beanJson, DepotHead.class);
|
//校验单号是否重复
|
if(checkIsBillNumberExist(depotHead.getId(), depotHead.getNumber())>0) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_BILL_NUMBER_EXIST_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_BILL_NUMBER_EXIST_MSG));
|
}
|
//校验是否同时录入关联请购单号和关联订单号
|
if(StringUtil.isNotEmpty(depotHead.getLinkNumber()) && StringUtil.isNotEmpty(depotHead.getLinkApply())) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_EXIST_REPEAT_NO_FAILED_CODE,
|
String.format(ExceptionConstants.DEPOT_ITEM_EXIST_REPEAT_NO_FAILED_MSG));
|
}
|
//校验单据状态,如果不是未审核则提示
|
if(!"0".equals(getDepotHead(depotHead.getId()).getStatus())) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_BILL_CANNOT_EDIT_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_BILL_CANNOT_EDIT_MSG));
|
}
|
//获取之前的会员id
|
Long preOrganId = getDepotHead(depotHead.getId()).getOrganId();
|
String subType = depotHead.getSubType();
|
//结算账户校验
|
if("采购".equals(subType) || "采购退货".equals(subType) || "销售".equals(subType) || "销售退货".equals(subType)) {
|
if (StringUtil.isEmpty(depotHead.getAccountIdList()) && depotHead.getAccountId() == null) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_ACCOUNT_FAILED_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_ACCOUNT_FAILED_MSG));
|
}
|
}
|
if(StringUtil.isNotEmpty(depotHead.getAccountIdList())){
|
depotHead.setAccountIdList(depotHead.getAccountIdList().replace("[", "").replace("]", "").replaceAll("\"", ""));
|
}
|
if(StringUtil.isNotEmpty(depotHead.getAccountMoneyList())) {
|
//校验多账户的结算金额
|
String accountMoneyList = depotHead.getAccountMoneyList().replace("[", "").replace("]", "").replaceAll("\"", "");
|
BigDecimal sum = StringUtil.getArrSum(accountMoneyList.split(","));
|
BigDecimal manyAccountSum = sum.abs();
|
if(manyAccountSum.compareTo(depotHead.getChangeAmount().abs())!=0) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_MANY_ACCOUNT_FAILED_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_MANY_ACCOUNT_FAILED_MSG));
|
}
|
depotHead.setAccountMoneyList(accountMoneyList);
|
}
|
//校验累计扣除订金是否超出订单中的金额
|
if(depotHead.getDeposit()!=null && StringUtil.isNotEmpty(depotHead.getLinkNumber())) {
|
BigDecimal finishDeposit = depotHeadMapperEx.getFinishDepositByNumberExceptCurrent(depotHead.getLinkNumber(), depotHead.getNumber());
|
//订单中的订金金额
|
BigDecimal changeAmount = getDepotHead(depotHead.getLinkNumber()).getChangeAmount();
|
if(changeAmount!=null) {
|
BigDecimal preDeposit = changeAmount.abs();
|
if(depotHead.getDeposit().add(finishDeposit).compareTo(preDeposit)>0) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_DEPOSIT_OVER_PRE_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_DEPOSIT_OVER_PRE_MSG));
|
}
|
}
|
}
|
//校验附件的数量
|
if(StringUtil.isNotEmpty(depotHead.getFileName())) {
|
String[] fileArr = depotHead.getFileName().split(",");
|
if(fileArr.length>4) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_FILE_NUM_LIMIT_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_FILE_NUM_LIMIT_MSG, 4));
|
}
|
}
|
depotHeadMapper.updateByPrimaryKeySelective(depotHead);
|
//如果存在多账户结算需要将原账户的id置空
|
if(StringUtil.isNotEmpty(depotHead.getAccountIdList())) {
|
depotHeadMapperEx.setAccountIdToNull(depotHead.getId());
|
}
|
/**入库和出库处理预付款信息*/
|
if(BusinessConstants.PAY_TYPE_PREPAID.equals(depotHead.getPayType())){
|
if(depotHead.getOrganId()!=null){
|
BigDecimal currentAdvanceIn = supplierService.getSupplier(depotHead.getOrganId()).getAdvanceIn();
|
if(currentAdvanceIn.compareTo(depotHead.getTotalPrice())>=0) {
|
//更新会员的预付款
|
supplierService.updateAdvanceIn(depotHead.getOrganId());
|
if(null != preOrganId && !preOrganId.equals(depotHead.getOrganId())) {
|
//更新之前会员的预付款
|
supplierService.updateAdvanceIn(preOrganId);
|
}
|
} else {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_MEMBER_PAY_LACK_CODE,
|
String.format(ExceptionConstants.DEPOT_HEAD_MEMBER_PAY_LACK_MSG));
|
}
|
}
|
}
|
/**入库和出库处理单据子表信息*/
|
depotItemService.saveDetials(rows,depotHead.getId(), "update",request);
|
logService.insertLog("单据",
|
new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(depotHead.getNumber()).toString(),
|
((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
|
}
|
|
public Map<String, Object> getBuyAndSaleStatistics(String today, String monthFirstDay, String yesterdayBegin, String yesterdayEnd,
|
String yearBegin, String yearEnd, HttpServletRequest request) throws Exception {
|
Long userId = userService.getUserId(request);
|
String priceLimit = userService.getRoleTypeByUserId(userId).getPriceLimit();
|
Boolean forceFlag = systemConfigService.getForceApprovalFlag();
|
String[] creatorArray = getCreatorArray();
|
List<InOutPriceVo> inOutPriceVoList = depotHeadMapperEx.getBuyAndSaleStatisticsList(yearBegin, yearEnd, creatorArray, forceFlag);
|
|
String[] periods = {"today", "month", "yesterday", "year"};
|
String[] types = {"Buy", "BuyBack", "Sale", "SaleBack", "RetailSale", "RetailSaleBack"};
|
|
Map<String, BigDecimal> statistics = new HashMap<>();
|
|
// 初始化 statistics Map
|
for (String period : periods) {
|
for (String type : types) {
|
statistics.put(period + type, BigDecimal.ZERO);
|
}
|
}
|
|
Date todayDate = Tools.strToDate(today);
|
Date monthFirstDate = Tools.strToDate(monthFirstDay);
|
Date yesterdayStartDate = Tools.strToDate(yesterdayBegin);
|
Date yesterdayEndDate = Tools.strToDate(yesterdayEnd);
|
Date yearStartDate = Tools.strToDate(yearBegin);
|
Date yearEndDate = Tools.strToDate(yearEnd);
|
|
for (InOutPriceVo item : inOutPriceVoList) {
|
Date operTime = item.getOperTime();
|
BigDecimal discountLastMoney = item.getDiscountLastMoney();
|
BigDecimal totalPriceAbs = item.getTotalPrice().abs();
|
|
if (isWithinRange(operTime, todayDate, Tools.strToDate(getNow3()))) {
|
updateStatistics(statistics, item, "today", discountLastMoney, totalPriceAbs);
|
}
|
|
if (isWithinRange(operTime, monthFirstDate, Tools.strToDate(getNow3()))) {
|
updateStatistics(statistics, item, "month", discountLastMoney, totalPriceAbs);
|
}
|
|
if (isWithinRange(operTime, yesterdayStartDate, yesterdayEndDate)) {
|
updateStatistics(statistics, item, "yesterday", discountLastMoney, totalPriceAbs);
|
}
|
|
if (isWithinRange(operTime, yearStartDate, yearEndDate)) {
|
updateStatistics(statistics, item, "year", discountLastMoney, totalPriceAbs);
|
}
|
}
|
|
Map<String, Object> result = new HashMap<>();
|
for (String period : periods) {
|
result.put(period + "Buy", roleService.parseHomePriceByLimit(statistics.get(period + "Buy").subtract(statistics.get(period + "BuyBack")), "buy", priceLimit, "***", request));
|
result.put(period + "Sale", roleService.parseHomePriceByLimit(statistics.get(period + "Sale").subtract(statistics.get(period + "SaleBack")), "sale", priceLimit, "***", request));
|
result.put(period + "RetailSale", roleService.parseHomePriceByLimit(statistics.get(period + "RetailSale").subtract(statistics.get(period + "RetailSaleBack")), "retail", priceLimit, "***", request));
|
}
|
|
return result;
|
}
|
|
private boolean isWithinRange(Date operTime, Date startDate, Date endDate) {
|
return operTime.compareTo(startDate) >= 0 && operTime.compareTo(endDate) <= 0;
|
}
|
|
private void updateStatistics(Map<String, BigDecimal> statistics, InOutPriceVo item, String period, BigDecimal discountLastMoney, BigDecimal totalPriceAbs) {
|
switch (item.getType()) {
|
case "入库":
|
switch (item.getSubType()) {
|
case "采购":
|
statistics.put(period + "Buy", statistics.get(period + "Buy").add(discountLastMoney));
|
break;
|
case "销售退货":
|
statistics.put(period + "SaleBack", statistics.get(period + "SaleBack").add(discountLastMoney));
|
break;
|
case "零售退货":
|
statistics.put(period + "RetailSaleBack", statistics.get(period + "RetailSaleBack").add(totalPriceAbs));
|
break;
|
}
|
break;
|
case "出库":
|
switch (item.getSubType()) {
|
case "采购退货":
|
statistics.put(period + "BuyBack", statistics.get(period + "BuyBack").add(discountLastMoney));
|
break;
|
case "销售":
|
statistics.put(period + "Sale", statistics.get(period + "Sale").add(discountLastMoney));
|
break;
|
case "零售":
|
statistics.put(period + "RetailSale", statistics.get(period + "RetailSale").add(totalPriceAbs));
|
break;
|
}
|
break;
|
}
|
}
|
|
|
public DepotHead getDepotHead(String number)throws Exception {
|
DepotHead depotHead = new DepotHead();
|
try{
|
DepotHeadExample example = new DepotHeadExample();
|
example.createCriteria().andNumberEqualTo(number).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
|
List<DepotHead> list = depotHeadMapper.selectByExample(example);
|
if(null!=list && list.size()>0) {
|
depotHead = list.get(0);
|
}
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return depotHead;
|
}
|
|
public List<DepotHeadVo4List> debtList(Long organId, String materialParam, String number, String beginTime, String endTime,
|
String status, Integer offset, Integer rows) {
|
List<DepotHeadVo4List> resList = new ArrayList<>();
|
try{
|
String depotIds = depotService.findDepotStrByCurrentUser();
|
String [] depotArray=depotIds.split(",");
|
String [] creatorArray = getCreatorArray();
|
beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
|
endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
|
List<DepotHeadVo4List> list=depotHeadMapperEx.debtList(organId, creatorArray, status, number,
|
beginTime, endTime, materialParam, depotArray, offset, rows);
|
if (null != list) {
|
resList = parseDebtBillList(list);
|
}
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return resList;
|
}
|
|
public int debtListCount(Long organId, String materialParam, String number, String beginTime, String endTime,
|
String status) {
|
int total = 0;
|
try {
|
String depotIds = depotService.findDepotStrByCurrentUser();
|
String[] depotArray = depotIds.split(",");
|
String[] creatorArray = getCreatorArray();
|
beginTime = Tools.parseDayToTime(beginTime, BusinessConstants.DAY_FIRST_TIME);
|
endTime = Tools.parseDayToTime(endTime, BusinessConstants.DAY_LAST_TIME);
|
total = depotHeadMapperEx.debtListCount(organId, creatorArray, status, number,
|
beginTime, endTime, materialParam, depotArray);
|
} catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return total;
|
}
|
|
public void debtExport(Long organId, String materialParam, String number, String type, String subType,
|
String beginTime, String endTime, String status, String mpList,
|
HttpServletRequest request, HttpServletResponse response) {
|
try {
|
Long userId = userService.getUserId(request);
|
String priceLimit = userService.getRoleTypeByUserId(userId).getPriceLimit();
|
String billCategory = getBillCategory(subType);
|
String depotIds = depotService.findDepotStrByCurrentUser();
|
String[] depotArray = depotIds.split(",");
|
String[] creatorArray = getCreatorArray();
|
status = StringUtil.isNotEmpty(status) ? status : null;
|
beginTime = Tools.parseDayToTime(beginTime, BusinessConstants.DAY_FIRST_TIME);
|
endTime = Tools.parseDayToTime(endTime, BusinessConstants.DAY_LAST_TIME);
|
List<DepotHeadVo4List> dhList = new ArrayList<>();
|
List<DepotHeadVo4List> list = depotHeadMapperEx.debtList(organId, creatorArray, status, number,
|
beginTime, endTime, materialParam, depotArray, null, null);
|
if (null != list) {
|
dhList = parseDebtBillList(list);
|
}
|
//生成Excel文件
|
String fileName = "单据信息";
|
File file = new File("/opt/"+ fileName);
|
WritableWorkbook wtwb = Workbook.createWorkbook(file);
|
String oneTip = "";
|
String sheetOneStr = "";
|
if("采购".equals(subType)) {
|
oneTip = "供应商对账列表";
|
sheetOneStr = "供应商,单据编号,关联单据,商品信息,单据日期,操作员,单据金额,本单欠款,已付欠款,待付欠款,备注";
|
} else if("出库".equals(type) && "销售".equals(subType)) {
|
oneTip = "客户对账列表";
|
sheetOneStr = "客户,单据编号,关联单据,商品信息,单据日期,操作员,单据金额,本单欠款,已收欠款,待收欠款,备注";
|
}
|
if(StringUtil.isNotEmpty(beginTime) && StringUtil.isNotEmpty(endTime)) {
|
oneTip = oneTip + "(" + beginTime + "至" + endTime + ")";
|
}
|
List<String> sheetOneList = StringUtil.strToStringList(sheetOneStr);
|
String[] sheetOneArr = StringUtil.listToStringArray(sheetOneList);
|
List<Long> idList = new ArrayList<>();
|
List<String[]> billList = new ArrayList<>();
|
Map<Long, BillListCacheVo> billListCacheVoMap = new HashMap<>();
|
for (DepotHeadVo4List dh : dhList) {
|
idList.add(dh.getId());
|
BillListCacheVo billListCacheVo = new BillListCacheVo();
|
billListCacheVo.setNumber(dh.getNumber());
|
billListCacheVo.setOrganName(dh.getOrganName());
|
billListCacheVo.setOperTimeStr(getCenternTime(dh.getOperTime()));
|
billListCacheVoMap.put(dh.getId(), billListCacheVo);
|
String[] objs = new String[sheetOneArr.length];
|
objs[0] = dh.getOrganName();
|
objs[1] = dh.getNumber();
|
objs[2] = dh.getLinkNumber();
|
objs[3] = dh.getMaterialsList();
|
objs[4] = dh.getOperTimeStr();
|
objs[5] = dh.getUserName();
|
BigDecimal discountLastMoney = dh.getDiscountLastMoney() == null ? BigDecimal.ZERO : dh.getDiscountLastMoney();
|
BigDecimal otherMoney = dh.getOtherMoney() == null ? BigDecimal.ZERO : dh.getOtherMoney();
|
BigDecimal deposit = dh.getDeposit() == null ? BigDecimal.ZERO : dh.getDeposit();
|
objs[6] = parseDecimalToStr(discountLastMoney.add(otherMoney).subtract(deposit), 2);
|
objs[7] = parseDecimalToStr(dh.getNeedDebt(), 2);
|
objs[8] = parseDecimalToStr(dh.getFinishDebt(), 2);
|
objs[9] = parseDecimalToStr(dh.getDebt(), 2);
|
objs[10] = dh.getRemark();
|
billList.add(objs);
|
}
|
ExcelUtils.exportObjectsManySheet(wtwb, oneTip, sheetOneArr, "单据列表", 0, billList);
|
//导出明细数据
|
if(idList.size()>0) {
|
List<DepotItemVo4WithInfoEx> dataList = depotItemMapperEx.getBillDetailListByIds(idList);
|
String[] mpArr = mpList.split(",");
|
String twoTip = "";
|
String sheetTwoStr = "";
|
if ("采购".equals(subType)) {
|
twoTip = "供应商单据明细";
|
sheetTwoStr = "供应商,单据编号,单据日期,仓库名称,条码,名称,规格,型号,颜色,品牌,制造商,扩展信息,单位,序列号,批号,有效期,多属性,数量,单价,金额,税率(%),税额,价税合计,重量,备注";
|
} else if ("销售".equals(subType)) {
|
twoTip = "客户单据明细";
|
sheetTwoStr = "客户,单据编号,单据日期,仓库名称,条码,名称,规格,型号,颜色,品牌,制造商,扩展信息,单位,序列号,批号,有效期,多属性,数量,单价,金额,税率(%),税额,价税合计,重量,备注";
|
}
|
if (StringUtil.isNotEmpty(beginTime) && StringUtil.isNotEmpty(endTime)) {
|
twoTip = twoTip + "(" + beginTime + "至" + endTime + ")";
|
}
|
List<String> sheetTwoList = StringUtil.strToStringList(sheetTwoStr);
|
String[] sheetTwoArr = StringUtil.listToStringArray(sheetTwoList);
|
List<String[]> billDetail = new ArrayList<>();
|
for (DepotItemVo4WithInfoEx diEx : dataList) {
|
String[] objs = new String[sheetTwoArr.length];
|
BillListCacheVo billListCacheVo = billListCacheVoMap.get(diEx.getHeaderId());
|
objs[0] = billListCacheVo != null ? billListCacheVo.getOrganName() : "";
|
objs[1] = billListCacheVo != null ? billListCacheVo.getNumber() : "";
|
objs[2] = billListCacheVo != null ? billListCacheVo.getOperTimeStr() : "";
|
objs[3] = diEx.getDepotId() == null ? "" : diEx.getDepotName();
|
objs[4] = diEx.getBarCode();
|
objs[5] = diEx.getMName();
|
objs[6] = diEx.getMStandard();
|
objs[7] = diEx.getMModel();
|
objs[8] = diEx.getMColor();
|
objs[9] = diEx.getBrand();
|
objs[10] = diEx.getMMfrs();
|
objs[11] = depotItemService.getOtherInfo(mpArr, diEx);
|
objs[12] = diEx.getMaterialUnit();
|
objs[13] = diEx.getSnList();
|
objs[14] = diEx.getBatchNumber();
|
objs[15] = Tools.parseDateToStr(diEx.getExpirationDate());
|
objs[16] = diEx.getSku();
|
objs[17] = parseDecimalToStr(diEx.getOperNumber(), 2);
|
objs[18] = parseDecimalToStr(roleService.parseBillPriceByLimit(diEx.getUnitPrice(), billCategory, priceLimit, request), 2);
|
objs[19] = parseDecimalToStr(roleService.parseBillPriceByLimit(diEx.getAllPrice(), billCategory, priceLimit, request), 2);
|
objs[20] = parseDecimalToStr(roleService.parseBillPriceByLimit(diEx.getTaxRate(), billCategory, priceLimit, request), 2);
|
objs[21] = parseDecimalToStr(roleService.parseBillPriceByLimit(diEx.getTaxMoney(), billCategory, priceLimit, request), 2);
|
objs[22] = parseDecimalToStr(roleService.parseBillPriceByLimit(diEx.getTaxLastMoney(), billCategory, priceLimit, request), 2);
|
BigDecimal allWeight = diEx.getBasicNumber() == null || diEx.getWeight() == null ? BigDecimal.ZERO : diEx.getBasicNumber().multiply(diEx.getWeight());
|
objs[23] = parseDecimalToStr(allWeight, 2);
|
objs[24] = diEx.getRemark();
|
billDetail.add(objs);
|
}
|
ExcelUtils.exportObjectsManySheet(wtwb, twoTip, sheetTwoArr, "单据明细", 1, billDetail);
|
}
|
wtwb.write();
|
wtwb.close();
|
ExcelUtils.downloadExcel(file, file.getName(), response);
|
} catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
}
|
|
public List<DepotHeadVo4List> parseDebtBillList(List<DepotHeadVo4List> list) throws Exception {
|
List<Long> idList = new ArrayList<>();
|
List<DepotHeadVo4List> dhList = new ArrayList<>();
|
for (DepotHeadVo4List dh : list) {
|
idList.add(dh.getId());
|
}
|
//通过批量查询去构造map
|
Map<Long,String> materialsListMap = findMaterialsListMapByHeaderIdList(idList);
|
for (DepotHeadVo4List dh : list) {
|
if(dh.getChangeAmount() != null) {
|
dh.setChangeAmount(dh.getChangeAmount().abs());
|
}
|
if(dh.getTotalPrice() != null) {
|
dh.setTotalPrice(dh.getTotalPrice().abs());
|
}
|
if(dh.getDeposit() == null) {
|
dh.setDeposit(BigDecimal.ZERO);
|
}
|
if(dh.getOperTime() != null) {
|
dh.setOperTimeStr(getCenternTime(dh.getOperTime()));
|
}
|
BigDecimal discountLastMoney = dh.getDiscountLastMoney()!=null?dh.getDiscountLastMoney():BigDecimal.ZERO;
|
BigDecimal otherMoney = dh.getOtherMoney()!=null?dh.getOtherMoney():BigDecimal.ZERO;
|
BigDecimal deposit = dh.getDeposit()!=null?dh.getDeposit():BigDecimal.ZERO;
|
BigDecimal changeAmount = dh.getChangeAmount()!=null?dh.getChangeAmount().abs():BigDecimal.ZERO;
|
//本单欠款(如果退货则为负数)
|
dh.setNeedDebt(discountLastMoney.add(otherMoney).subtract(deposit.add(changeAmount)));
|
if(BusinessConstants.SUB_TYPE_PURCHASE_RETURN.equals(dh.getSubType()) || BusinessConstants.SUB_TYPE_SALES_RETURN.equals(dh.getSubType())) {
|
dh.setNeedDebt(BigDecimal.ZERO.subtract(dh.getNeedDebt()));
|
}
|
BigDecimal needDebt = dh.getNeedDebt()!=null?dh.getNeedDebt():BigDecimal.ZERO;
|
BigDecimal finishDebt = accountItemService.getEachAmountByBillId(dh.getId());
|
finishDebt = finishDebt!=null?finishDebt:BigDecimal.ZERO;
|
//已收欠款
|
dh.setFinishDebt(finishDebt);
|
//待收欠款
|
dh.setDebt(needDebt.subtract(finishDebt));
|
//商品信息简述
|
if(materialsListMap!=null) {
|
dh.setMaterialsList(materialsListMap.get(dh.getId()));
|
}
|
dhList.add(dh);
|
}
|
return dhList;
|
}
|
|
public String getBillCategory(String subType) {
|
if(subType.equals("零售") || subType.equals("零售退货")) {
|
return "retail";
|
} else if(subType.equals("销售订单") || subType.equals("销售") || subType.equals("销售退货")) {
|
return "sale";
|
} else {
|
return "buy";
|
}
|
}
|
|
/**
|
* 格式化金额样式
|
* @param decimal
|
* @param num
|
* @return
|
*/
|
private String parseDecimalToStr(BigDecimal decimal, Integer num) {
|
return decimal == null ? "" : decimal.setScale(num, BigDecimal.ROUND_HALF_UP).toString();
|
}
|
|
private String parseStatusToStr(String status, String type) {
|
if(StringUtil.isNotEmpty(status)) {
|
if("purchase".equals(type)) {
|
switch (status) {
|
case "2":
|
return "完成采购";
|
case "3":
|
return "部分采购";
|
}
|
} else if("sale".equals(type)) {
|
switch (status) {
|
case "2":
|
return "完成销售";
|
case "3":
|
return "部分销售";
|
}
|
}
|
switch (status) {
|
case "0":
|
return "未审核";
|
case "1":
|
return "已审核";
|
case "9":
|
return "审核中";
|
}
|
}
|
return "";
|
}
|
|
public List<DepotHeadVo4List> waitBillList(String number, String materialParam, String type, String subType,
|
String beginTime, String endTime, String status, int offset, int rows) {
|
List<DepotHeadVo4List> resList = new ArrayList<>();
|
try{
|
String [] depotArray = getDepotArray("其它");
|
//给仓管可以看全部的单据(此时可以通过分配仓库去控制权限)
|
String [] creatorArray = null;
|
String [] subTypeArray = StringUtil.isNotEmpty(subType) ? subType.split(",") : null;
|
String [] statusArray = StringUtil.isNotEmpty(status) ? status.split(",") : null;
|
Map<Long,String> accountMap = accountService.getAccountMap();
|
beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
|
endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
|
List<DepotHeadVo4List> list = depotHeadMapperEx.waitBillList(type, subTypeArray, creatorArray, statusArray, number, beginTime, endTime,
|
materialParam, depotArray, offset, rows);
|
if (null != list) {
|
List<Long> idList = new ArrayList<>();
|
for (DepotHeadVo4List dh : list) {
|
idList.add(dh.getId());
|
}
|
//通过批量查询去构造map
|
Map<Long,String> materialsListMap = findMaterialsListMapByHeaderIdList(idList);
|
Map<Long,BigDecimal> materialCountListMap = getMaterialCountListMapByHeaderIdList(idList);
|
for (DepotHeadVo4List dh : list) {
|
if(accountMap!=null && StringUtil.isNotEmpty(dh.getAccountIdList()) && StringUtil.isNotEmpty(dh.getAccountMoneyList())) {
|
String accountStr = accountService.getAccountStrByIdAndMoney(accountMap, dh.getAccountIdList(), dh.getAccountMoneyList());
|
dh.setAccountName(accountStr);
|
}
|
if(dh.getOperTime() != null) {
|
dh.setOperTimeStr(getCenternTime(dh.getOperTime()));
|
}
|
//商品信息简述
|
if(materialsListMap!=null) {
|
dh.setMaterialsList(materialsListMap.get(dh.getId()));
|
}
|
//商品总数量
|
if(materialCountListMap!=null) {
|
dh.setMaterialCount(materialCountListMap.get(dh.getId()));
|
}
|
resList.add(dh);
|
}
|
}
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return resList;
|
}
|
|
public Long waitBillCount(String number, String materialParam, String type, String subType,
|
String beginTime, String endTime, String status) {
|
Long result=null;
|
try{
|
String [] depotArray = getDepotArray("其它");
|
//给仓管可以看全部的单据(此时可以通过分配仓库去控制权限)
|
String [] creatorArray = null;
|
String [] subTypeArray = StringUtil.isNotEmpty(subType) ? subType.split(",") : null;
|
String [] statusArray = StringUtil.isNotEmpty(status) ? status.split(",") : null;
|
beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
|
endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
|
result=depotHeadMapperEx.waitBillCount(type, subTypeArray, creatorArray, statusArray, number, beginTime, endTime,
|
materialParam, depotArray);
|
}catch(Exception e){
|
JshException.readFail(logger, e);
|
}
|
return result;
|
}
|
|
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
|
public void batchAddDepotHeadAndDetail(String ids, HttpServletRequest request) throws Exception {
|
List<DepotHead> dhList = getDepotHeadListByIds(ids);
|
StringBuilder sb = new StringBuilder();
|
User userInfo=userService.getCurrentUser();
|
for(DepotHead depotHead : dhList) {
|
String prefixNo = BusinessConstants.DEPOTHEAD_TYPE_IN.equals(depotHead.getType())?"QTRK":"QTCK";
|
//关联单据单号
|
String oldNumber = depotHead.getNumber();
|
//校验单据最新状态不能进行批量操作
|
if("0".equals(depotHead.getStatus()) || "2".equals(depotHead.getStatus()) || "9".equals(depotHead.getStatus())) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_EXIST_NEW_STATUS_FAILED_CODE,
|
String.format(ExceptionConstants.DEPOT_ITEM_EXIST_NEW_STATUS_FAILED_MSG, oldNumber, depotHead.getType()));
|
}
|
//校验是否是部分入库或者部分出库
|
if("3".equals(depotHead.getStatus())) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_EXIST_PARTIALLY_STATUS_FAILED_CODE,
|
String.format(ExceptionConstants.DEPOT_ITEM_EXIST_PARTIALLY_STATUS_FAILED_MSG, oldNumber, depotHead.getType()));
|
}
|
depotHead.setLinkNumber(oldNumber);
|
//给单号重新赋值
|
String number = prefixNo + sequenceService.buildOnlyNumber();
|
depotHead.setNumber(number);
|
depotHead.setDefaultNumber(number);
|
depotHead.setOperTime(new Date());
|
depotHead.setSubType(BusinessConstants.SUB_TYPE_OTHER);
|
depotHead.setChangeAmount(BigDecimal.ZERO);
|
depotHead.setTotalPrice(BigDecimal.ZERO);
|
depotHead.setDiscountLastMoney(BigDecimal.ZERO);
|
depotHead.setCreator(userInfo==null?null:userInfo.getId());
|
depotHead.setOrganId(null);
|
depotHead.setAccountId(null);
|
depotHead.setAccountIdList(null);
|
depotHead.setAccountMoneyList(null);
|
depotHead.setSalesMan(null);
|
depotHead.setStatus("0");
|
depotHead.setTenantId(null);
|
//查询明细
|
List<DepotItemVo4WithInfoEx> itemList = depotItemService.getDetailList(depotHead.getId());
|
depotHead.setId(null);
|
JSONArray rowArr = new JSONArray();
|
for(DepotItemVo4WithInfoEx item: itemList) {
|
if("1".equals(item.getEnableSerialNumber())) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_EXIST_SERIAL_NUMBER_FAILED_CODE,
|
String.format(ExceptionConstants.DEPOT_ITEM_EXIST_SERIAL_NUMBER_FAILED_MSG, oldNumber));
|
}
|
if("1".equals(item.getEnableBatchNumber())) {
|
throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_EXIST_BATCH_NUMBER_FAILED_CODE,
|
String.format(ExceptionConstants.DEPOT_ITEM_EXIST_BATCH_NUMBER_FAILED_MSG, oldNumber));
|
}
|
item.setUnitPrice(BigDecimal.ZERO);
|
item.setAllPrice(BigDecimal.ZERO);
|
item.setLinkId(item.getId());
|
item.setTenantId(null);
|
String itemStr = JSONObject.toJSONString(item);
|
JSONObject itemObj = JSONObject.parseObject(itemStr);
|
itemObj.put("unit", itemObj.getString("materialUnit"));
|
rowArr.add(itemObj.toJSONString());
|
}
|
String rows = rowArr.toJSONString();
|
//新增其它入库单或其它出库单
|
sb.append("[").append(depotHead.getNumber()).append("]");
|
depotHeadMapper.insertSelective(depotHead);
|
//根据单据编号查询单据id
|
DepotHeadExample dhExample = new DepotHeadExample();
|
dhExample.createCriteria().andNumberEqualTo(depotHead.getNumber()).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
|
List<DepotHead> list = depotHeadMapper.selectByExample(dhExample);
|
if(list!=null) {
|
Long headId = list.get(0).getId();
|
/**入库和出库处理单据子表信息*/
|
depotItemService.saveDetials(rows, headId, "add", request);
|
}
|
}
|
logService.insertLog("单据",
|
new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_BATCH_ADD).append(sb).toString(),
|
((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
|
}
|
}
|