package com.jsh.action.materials;

import java.io.IOException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.springframework.dao.DataAccessException;

import com.jsh.base.BaseAction;
import com.jsh.base.Log;
import com.jsh.model.po.Account;
import com.jsh.model.po.Depot;
import com.jsh.model.po.DepotHead;
import com.jsh.model.po.Logdetails;
import com.jsh.model.po.Person;
import com.jsh.model.po.Supplier;
import com.jsh.model.vo.materials.DepotHeadModel;
import com.jsh.service.materials.DepotHeadIService;
import com.jsh.util.JshException;
import com.jsh.util.PageUtil;
import com.jsh.util.Tools;


/*
 * 单据表头管理
 * @author jishenghua  qq:752718920
*/
@SuppressWarnings("serial")
public class DepotHeadAction extends BaseAction<DepotHeadModel>
{
    private DepotHeadIService depotHeadService;
    private DepotHeadModel model = new DepotHeadModel();
    
	/*
	 * 获取MaxId
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public String getMaxId()  
	{
        Map<String,List> mapData = model.getShowModel().getMap();
        PageUtil pageUtil = new  PageUtil();
        pageUtil.setPageSize(0);
        pageUtil.setCurPage(0);
        try
        {
        	depotHeadService.find(pageUtil,"maxId");
            mapData.put("depotHeadMax", pageUtil.getPageList());
        }
        catch (Exception e)
        {
            Log.errorFileSync(">>>>>>>>>>>>>查找最大的Id信息异常", e);
            model.getShowModel().setMsgTip("exceptoin");
        }
        return SUCCESS;
	}
	
	/**
	 * 增加单据
	 * @return
	 */
	public void create(){
	    Log.infoFileSync("==================开始调用增加单据信息信息方法create()===================");
	    Boolean flag = false;
		try
		{
			DepotHead depotHead = new DepotHead();
			depotHead.setType(model.getType());
			depotHead.setSubType(model.getSubType());
			if(model.getProjectId()!=null){depotHead.setProjectId(new Depot(model.getProjectId()));}
			//构造新的编号
			String dNumber = model.getDefaultNumber();
			String number = dNumber.substring(0,12); //截取前缀
			String beginTime = Tools.getNow() + " 00:00:00";
			String endTime =  Tools.getNow() + " 23:59:59";
			String newNumber = buildNumberFun(model.getType(), model.getSubType(), beginTime, endTime);  //从数据库查询最新的编号+1,这样能防止重复
			String allNewNumber = number + newNumber;
			depotHead.setNumber(model.getNumber()); //一直从前端文本框里面获取
			depotHead.setDefaultNumber(allNewNumber); //初始编号，一直都从后台取值

			depotHead.setOperPersonName(getUser().getUsername());
			depotHead.setCreateTime(new Timestamp(new Date().getTime()));
			try{
				depotHead.setOperTime(new Timestamp(Tools.parse(model.getOperTime(), "yyyy-MM-dd HH:mm:ss").getTime()));
            }
			catch (ParseException e){
                Log.errorFileSync(">>>>>>>>>>>>>>>解析购买日期格式异常", e);
            }
			if(model.getOrganId()!=null){depotHead.setOrganId(new Supplier(model.getOrganId()));}
			if(model.getHandsPersonId()!=null){depotHead.setHandsPersonId(new Person(model.getHandsPersonId()));}
			if(model.getSalesman()!=null){
				depotHead.setSalesman(model.getSalesman().toString());
			}
			if(model.getAccountId()!=null){depotHead.setAccountId(new Account(model.getAccountId()));}
			depotHead.setChangeAmount(model.getChangeAmount());
			depotHead.setAccountIdList(model.getAccountIdList());
			depotHead.setAccountMoneyList(model.getAccountMoneyList());
			depotHead.setDiscount(model.getDiscount());
			depotHead.setDiscountMoney(model.getDiscountMoney());
			depotHead.setDiscountLastMoney(model.getDiscountLastMoney());
			depotHead.setOtherMoney(model.getOtherMoney());
			depotHead.setOtherMoneyList(model.getOtherMoneyList());
			depotHead.setOtherMoneyItem(model.getOtherMoneyItem());
			depotHead.setAccountDay(model.getAccountDay());
			if(model.getAllocationProjectId()!=null){depotHead.setAllocationProjectId(new Depot(model.getAllocationProjectId()));}
			depotHead.setTotalPrice(model.getTotalPrice());
			depotHead.setPayType(model.getPayType());
			depotHead.setStatus(false);
			depotHead.setRemark(model.getRemark());
			depotHeadService.create(depotHead);
			
			//========标识位===========
		    flag = true;
			//记录操作日志使用
			tipMsg = "成功";
            tipType = 0;
		}
		catch (DataAccessException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>增加单据信息异常", e);
			flag = false;
			tipMsg = "失败";
            tipType = 1;
		}
		finally {
		    try {
                toClient(flag.toString());
            } 
		    catch (IOException e) {
                Log.errorFileSync(">>>>>>>>>>>>增加单据信息回写客户端结果异常", e);
            }
		}
		
		logService.create(new Logdetails(getUser(), "增加单据", model.getClientIp(),
                new Timestamp(System.currentTimeMillis())
        , tipType, "增加单据编号为  "+ model.getNumber() + " " + tipMsg + "！", "增加单据" + tipMsg));
		Log.infoFileSync("==================结束调用增加单据方法create()===================");
	}
	
	/**
	 * 删除单据
	 * @return
	 */
	public String delete() {
	    Log.infoFileSync("====================开始调用删除单据信息方法delete()================");
	    try {
	    	depotHeadService.delete(model.getDepotHeadID());
            tipMsg = "成功";
            tipType = 0;
        } 
	    catch (DataAccessException e) {
	        Log.errorFileSync(">>>>>>>>>>>删除ID为 " + model.getDepotHeadID() + "  的单据异常", e);
	        tipMsg = "失败";
            tipType = 1;
        }
	    model.getShowModel().setMsgTip(tipMsg);
	    logService.create(new Logdetails(getUser(), "删除单据", model.getClientIp(),
	            new Timestamp(System.currentTimeMillis())
	    , tipType, "删除单据ID为  "+ model.getDepotHeadID() + " " + tipMsg + "！", "删除单据" + tipMsg));
	    Log.infoFileSync("====================结束调用删除单据信息方法delete()================");
	    return SUCCESS;
	}
	
	/**
	 * 更新单据
	 * @return
	 */
	public void update() {
	    Boolean flag = false;
        try {
        	DepotHead depotHead = depotHeadService.get(model.getDepotHeadID());
			depotHead.setType(model.getType());
			depotHead.setSubType(model.getSubType());
			if(model.getProjectId()!=null){depotHead.setProjectId(new Depot(model.getProjectId()));}
			depotHead.setNumber(model.getNumber());
			depotHead.setOperPersonName(getUser().getUsername());
			try{
				depotHead.setOperTime(new Timestamp(Tools.parse(model.getOperTime(), "yyyy-MM-dd HH:mm:ss").getTime()));
            }
			catch (ParseException e) {
                Log.errorFileSync(">>>>>>>>>>>>>>>解析入库时间格式异常", e);
            }
			if(model.getOrganId()!=null){depotHead.setOrganId(new Supplier(model.getOrganId()));}
			if(model.getHandsPersonId()!=null){depotHead.setHandsPersonId(new Person(model.getHandsPersonId()));}
			depotHead.setSalesman(model.getSalesman());
			if(model.getAccountId()!=null){
				depotHead.setAccountId(new Account(model.getAccountId()));
			}
			else {
				depotHead.setAccountId(null);
			}
			depotHead.setChangeAmount(model.getChangeAmount());
			depotHead.setAccountIdList(model.getAccountIdList());
			depotHead.setAccountMoneyList(model.getAccountMoneyList());
			depotHead.setDiscount(model.getDiscount());
			depotHead.setDiscountMoney(model.getDiscountMoney());
			depotHead.setDiscountLastMoney(model.getDiscountLastMoney());
			depotHead.setOtherMoney(model.getOtherMoney());
			depotHead.setOtherMoneyList(model.getOtherMoneyList());
			depotHead.setOtherMoneyItem(model.getOtherMoneyItem());
			depotHead.setAccountDay(model.getAccountDay());
			if(model.getAllocationProjectId()!=null){depotHead.setAllocationProjectId(new Depot(model.getAllocationProjectId()));}
			depotHead.setTotalPrice(model.getTotalPrice());
			depotHead.setPayType(model.getPayType());
			depotHead.setStatus(false);
			depotHead.setRemark(model.getRemark());
        	depotHeadService.update(depotHead);
            
            flag = true;
            tipMsg = "成功";
            tipType = 0;
        } 
        catch (DataAccessException e) {
            Log.errorFileSync(">>>>>>>>>>>>>修改单据ID为 ： " + model.getDepotHeadID() + "信息失败", e);
            flag = false;
            tipMsg = "失败";
            tipType = 1;
        }
        finally {
            try {
                toClient(flag.toString());
            } 
            catch (IOException e) {
                Log.errorFileSync(">>>>>>>>>>>>修改单据回写客户端结果异常", e);
            }
        }
        logService.create(new Logdetails(getUser(), "更新单据", model.getClientIp(),
                new Timestamp(System.currentTimeMillis())
        , tipType, "更新单据ID为  "+ model.getDepotHeadID() + " " + tipMsg + "！", "更新单据" + tipMsg));
	}
	
	/**
	 * 批量删除指定ID单据
	 * @return
	 */
	public String batchDelete()
	{
	    try
	    {
	    	depotHeadService.batchDelete(model.getDepotHeadIDs());
            model.getShowModel().setMsgTip("成功");
            //记录操作日志使用
            tipMsg = "成功";
            tipType = 0;
        } 
	    catch (DataAccessException e) 
	    {
	        Log.errorFileSync(">>>>>>>>>>>批量删除单据ID为：" + model.getDepotHeadIDs() + "信息异常", e);
	        tipMsg = "失败";
            tipType = 1;
        }
	    
	    logService.create(new Logdetails(getUser(), "批量删除单据", model.getClientIp(),
                new Timestamp(System.currentTimeMillis())
        , tipType, "批量删除单据ID为  "+ model.getDepotHeadIDs() + " " + tipMsg + "！", "批量删除单据" + tipMsg));
	    return SUCCESS;
	}

	/**
	 * 批量设置状态-审核或者反审核
	 * @return
	 */
	public String batchSetStatus() {
		try {
			depotHeadService.batchSetStatus(model.getStatus(), model.getDepotHeadIDs());
			model.getShowModel().setMsgTip("成功");
			//记录操作日志使用
			tipMsg = "成功";
			tipType = 0;
		}
		catch (DataAccessException e) {
			Log.errorFileSync(">>>>>>>>>>>批量修改状态，单据ID为：" + model.getDepotHeadIDs() + "信息异常", e);
			tipMsg = "失败";
			tipType = 1;
		}

		logService.create(new Logdetails(getUser(), "批量修改单据状态", model.getClientIp(),
				new Timestamp(System.currentTimeMillis())
				, tipType, "批量修改状态，单据ID为  "+ model.getDepotHeadIDs() + " " + tipMsg + "！", "批量修改单据状态" + tipMsg));
		return SUCCESS;
	}

	/**
	 * 检查单据编号是否存在
	 */
	public void checkIsNumberExist() {
		Boolean flag = false;
		try {
			flag = depotHeadService.checkIsNameExist("Number", model.getNumber(), "Id", model.getDepotHeadID());
		}
		catch (DataAccessException e)
		{
			Log.errorFileSync(">>>>>>>>>>>>>>>>>检查单据编号为：" + model.getNumber() + " ID为： " + model.getDepotHeadID() + " 是否存在出现异常！");
		}
		finally
		{
			try
			{
				toClient(flag.toString());
			}
			catch (IOException e)
			{
				Log.errorFileSync(">>>>>>>>>>>>回写检查单据编号为：" + model.getNumber() + " ID为： " + model.getDepotHeadID() + " 是否存在出现异常！",e);
			}
		}
	}

	/**
	 * 单据编号生成接口，规则：查找当前类型单据下的当天最大的单据号，并加1
	 */
	public void buildNumber(){
		try {
			String beginTime = model.getBeginTime();
			String endTime = model.getEndTime();
			String newNumber = buildNumberFun(model.getType(),  model.getSubType(), beginTime, endTime);
			JSONObject outer = new JSONObject();
			outer.put("DefaultNumber", newNumber);
			//回写查询结果
			toClient(outer.toString());
		}
		catch (DataAccessException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>单据编号生成异常", e);
		}
		catch (IOException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>回写单据编号生成接口异常", e);
		}
	}

	/**
	 * 查找单据编号
	 * @return
	 */
	public String buildNumberFun(String type,String subType,String beginTime,String endTime){
		String newNumber = "0001"; //新编号
		try {
			PageUtil<DepotHead> pageUtil = new PageUtil<DepotHead>();
			pageUtil.setPageSize(0);
			pageUtil.setCurPage(0);
			pageUtil.setAdvSearch(buildNumberCondition(type, subType, beginTime, endTime));
			depotHeadService.find(pageUtil);
			List<DepotHead> dataList = pageUtil.getPageList();
			//存放数据json数组
			if (null != dataList && dataList.size() > 0) {
				DepotHead depotHead = dataList.get(0);
				if (depotHead != null) {
					String number = depotHead.getDefaultNumber(); //最大的单据编号
					if (number != null) {
						Integer lastNumber = Integer.parseInt(number.substring(12, 16)); //末四尾
						lastNumber = lastNumber + 1;
						Integer nLen = lastNumber.toString().length();
						if (nLen == 1) {
							newNumber = "000" + lastNumber.toString();
						} else if (nLen == 2) {
							newNumber = "00" + lastNumber.toString();
						} else if (nLen == 3) {
							newNumber = "0" + lastNumber.toString();
						} else if (nLen == 4) {
							newNumber = lastNumber.toString();
						}
					}
				}
			}
		}
		catch (DataAccessException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>单据编号生成异常", e);
		}
		return newNumber;
	}

	/**
	 * 根据材料信息获取
	 */
	public void getHeaderIdByMaterial(){
		try {
			String materialParam = model.getMaterialParam(); //商品参数
			String depotIds = model.getDepotIds(); //拥有的仓库信息
			PageUtil pageUtil = new  PageUtil();
			pageUtil.setPageSize(0);
			pageUtil.setCurPage(0);
			depotHeadService.getHeaderIdByMaterial(pageUtil, materialParam, depotIds);
			JSONObject outer = new JSONObject();
			String allReturn = "";
			List dataList = pageUtil.getPageList();
			if(dataList!=null) {
				for (Integer i = 0; i < dataList.size(); i++) {
					Object dl = dataList.get(i); //获取对象
					allReturn = allReturn + dl.toString() + ",";
				}
			}
			allReturn = allReturn.substring(0,allReturn.length()-1);
			if(allReturn.equals("null")){
				allReturn = "";
			}
			outer.put("ret", allReturn);
			//回写查询结果
			toClient(outer.toString());
		}
		catch (JshException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>查找信息异常", e);
		}
		catch (IOException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>回写查询单据信息结果异常", e);
		}
	}

	/**
	 * 查找单据信息
	 * @return
	 */
    public void findBy() {
	    try {
	        PageUtil<DepotHead> pageUtil = new  PageUtil<DepotHead>();
            pageUtil.setPageSize(model.getPageSize());
            pageUtil.setCurPage(model.getPageNo());
            pageUtil.setAdvSearch(getCondition());
            depotHeadService.find(pageUtil);
            List<DepotHead> dataList = pageUtil.getPageList();

            JSONObject outer = new JSONObject();
            outer.put("total", pageUtil.getTotalCount());
            //存放数据json数组
            JSONArray dataArray = new JSONArray();
            if(null != dataList) {
                for(DepotHead depotHead:dataList) {
                    JSONObject item = new JSONObject();
                    item.put("Id", depotHead.getId());
                    item.put("ProjectId", depotHead.getProjectId()==null?"":depotHead.getProjectId().getId());
                    item.put("ProjectName", depotHead.getProjectId()==null?"":depotHead.getProjectId().getName());
                    item.put("Number", depotHead.getNumber());
                    item.put("OperPersonName", depotHead.getOperPersonName());
                    item.put("CreateTime", Tools.getCenternTime(depotHead.getCreateTime()));
                    item.put("OperTime", Tools.getCenternTime(depotHead.getOperTime()));
                    item.put("OrganId", depotHead.getOrganId()==null?"":depotHead.getOrganId().getId());
                    item.put("OrganName", depotHead.getOrganId()==null?"":depotHead.getOrganId().getSupplier());
                    item.put("HandsPersonId", depotHead.getHandsPersonId()==null?"":depotHead.getHandsPersonId().getId());
					item.put("Salesman", depotHead.getSalesman().toString());
                    item.put("HandsPersonName", depotHead.getHandsPersonId()==null?"":depotHead.getHandsPersonId().getName());
                    item.put("AccountId", depotHead.getAccountId()==null?"":depotHead.getAccountId().getId());
                    item.put("AccountName", depotHead.getAccountId()==null?"":depotHead.getAccountId().getName());
                    item.put("ChangeAmount", depotHead.getChangeAmount()==null?"":Math.abs(depotHead.getChangeAmount()));
					item.put("AccountIdList", depotHead.getAccountIdList());
					item.put("AccountMoneyList", depotHead.getAccountMoneyList());
					item.put("Discount", depotHead.getDiscount());
					item.put("DiscountMoney", depotHead.getDiscountMoney());
					item.put("DiscountLastMoney", depotHead.getDiscountLastMoney());
					item.put("OtherMoney", depotHead.getOtherMoney());
					item.put("OtherMoneyList", depotHead.getOtherMoneyList()); //id列表
					item.put("OtherMoneyItem", depotHead.getOtherMoneyItem()); //money列表
					item.put("AccountDay", depotHead.getAccountDay()); //结算天数
                    item.put("AllocationProjectId", depotHead.getAllocationProjectId()==null?"":depotHead.getAllocationProjectId().getId());
                    item.put("AllocationProjectName", depotHead.getAllocationProjectId()==null?"":depotHead.getAllocationProjectId().getName());
                    item.put("TotalPrice", depotHead.getTotalPrice()==null?"":Math.abs(depotHead.getTotalPrice()));
					item.put("payType", depotHead.getPayType()==null?"":depotHead.getPayType());
					item.put("Status", depotHead.getStatus());
                    item.put("Remark", depotHead.getRemark());
					item.put("MaterialsList", findMaterialsListByHeaderId(depotHead.getId()));
                    item.put("op", 1);
                    dataArray.add(item);
                }
            }
            outer.put("rows", dataArray);
            //回写查询结果
            toClient(outer.toString());
        } 
	    catch (DataAccessException e) {
	        Log.errorFileSync(">>>>>>>>>>>>>>>>>>>查找单据信息异常", e);
        } 
	    catch (IOException e) {
            Log.errorFileSync(">>>>>>>>>>>>>>>>>>>回写查询单据信息结果异常", e);
        }
	}

	/**
	 * 根据编号查询单据信息
	 */
	public void getDetailByNumber(){
		try {
			PageUtil<DepotHead> pageUtil = new  PageUtil<DepotHead>();
			pageUtil.setPageSize(0);
			pageUtil.setCurPage(0);
			pageUtil.setAdvSearch(getConditionByNumber());
			depotHeadService.find(pageUtil);
			List<DepotHead> dataList = pageUtil.getPageList();
			JSONObject item = new JSONObject();
			if(dataList!=null && dataList.get(0)!=null) {
				DepotHead depotHead = dataList.get(0);
				item.put("Id", depotHead.getId());
				item.put("ProjectId", depotHead.getProjectId()==null?"":depotHead.getProjectId().getId());
				item.put("ProjectName", depotHead.getProjectId()==null?"":depotHead.getProjectId().getName());
				item.put("Number", depotHead.getNumber());
				item.put("OperPersonName", depotHead.getOperPersonName());
				item.put("CreateTime", Tools.getCenternTime(depotHead.getCreateTime()));
				item.put("OperTime", Tools.getCenternTime(depotHead.getOperTime()));
				item.put("OrganId", depotHead.getOrganId()==null?"":depotHead.getOrganId().getId());
				item.put("OrganName", depotHead.getOrganId()==null?"":depotHead.getOrganId().getSupplier());
				item.put("HandsPersonId", depotHead.getHandsPersonId()==null?"":depotHead.getHandsPersonId().getId());
				item.put("Salesman", depotHead.getSalesman().toString());
				item.put("HandsPersonName", depotHead.getHandsPersonId()==null?"":depotHead.getHandsPersonId().getName());
				item.put("AccountId", depotHead.getAccountId()==null?"":depotHead.getAccountId().getId());
				item.put("AccountName", depotHead.getAccountId()==null?"":depotHead.getAccountId().getName());
				item.put("ChangeAmount", depotHead.getChangeAmount()==null?"":Math.abs(depotHead.getChangeAmount()));
				item.put("AccountIdList", depotHead.getAccountIdList());
				item.put("AccountMoneyList", depotHead.getAccountMoneyList());
				item.put("Discount", depotHead.getDiscount());
				item.put("DiscountMoney", depotHead.getDiscountMoney());
				item.put("DiscountLastMoney", depotHead.getDiscountLastMoney());
				item.put("OtherMoney", depotHead.getOtherMoney());
				item.put("OtherMoneyList", depotHead.getOtherMoneyList()); //id列表
				item.put("OtherMoneyItem", depotHead.getOtherMoneyItem()); //money列表
				item.put("AccountDay", depotHead.getAccountDay()); //结算天数
				item.put("AllocationProjectId", depotHead.getAllocationProjectId()==null?"":depotHead.getAllocationProjectId().getId());
				item.put("AllocationProjectName", depotHead.getAllocationProjectId()==null?"":depotHead.getAllocationProjectId().getName());
				item.put("TotalPrice", depotHead.getTotalPrice()==null?"":Math.abs(depotHead.getTotalPrice()));
				item.put("payType", depotHead.getPayType()==null?"":depotHead.getPayType());
				item.put("Status", depotHead.getStatus());
				item.put("Remark", depotHead.getRemark());
				item.put("MaterialsList", findMaterialsListByHeaderId(depotHead.getId()));
			}
			//回写查询结果
			toClient(item.toString());
		}
		catch (DataAccessException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>查找单据信息异常", e);
		}
		catch (IOException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>回写查询单据信息结果异常", e);
		}
	}
    
	/**
	 * 查找单据_根据月份(报表)
	 * @return
	 */
    public void findByMonth() {
	    try 
	    {
	    	PageUtil<DepotHead> pageUtil = new  PageUtil<DepotHead>();
	    	pageUtil.setPageSize(1000);
            pageUtil.setCurPage(1);
	    	pageUtil.setAdvSearch(getConditionHead());
            depotHeadService.find(pageUtil);
            List<DepotHead> dataList = pageUtil.getPageList();
            JSONObject outer = new JSONObject();            
	    	String headId = "";
	    	if(null != dataList)
            {
                for(DepotHead depotHead:dataList)
                {
                	headId = headId + depotHead.getId() + ",";
                }
            }
	    	if(headId!="") {
	    		headId = headId.substring(0, headId.lastIndexOf(","));
	    	}
	    	outer.put("HeadIds", headId);
            toClient(outer.toString());
        } 
	    catch (DataAccessException e) 
	    {
	        Log.errorFileSync(">>>>>>>>>>>>>>>>>>>查找单据信息异常", e);
        } 
	    catch (IOException e) 
	    {
            Log.errorFileSync(">>>>>>>>>>>>>>>>>>>回写查询单据信息结果异常", e);
        }
	}

	/**
	 * 查找统计信息_根据礼品卡(报表)
	 * @return
	 */
	public void findGiftReport() {
		try {
			PageUtil<DepotHead> pageUtil_in = new  PageUtil<DepotHead>();
			pageUtil_in.setPageSize(0);
			pageUtil_in.setCurPage(0);
			pageUtil_in.setAdvSearch(getConditionHead_Gift_In());
			depotHeadService.find(pageUtil_in);
			List<DepotHead> dataList_in = pageUtil_in.getPageList();
			JSONObject outer = new JSONObject();
			String headId = "";
			if(null != dataList_in) {
				for(DepotHead depotHead:dataList_in) {
					headId = headId + depotHead.getId() + ",";
				}
				PageUtil<DepotHead> pageUtil_out = new  PageUtil<DepotHead>();
				pageUtil_out.setPageSize(0);
				pageUtil_out.setCurPage(0);
				pageUtil_out.setAdvSearch(getConditionHead_Gift_Out());
				depotHeadService.find(pageUtil_out);
				List<DepotHead> dataList_out = pageUtil_out.getPageList();
				if(null != dataList_out) {
					for(DepotHead depotHead:dataList_out) {
						headId = headId + depotHead.getId() + ",";
					}
				}
			}
			if(headId!="") {
				headId = headId.substring(0, headId.lastIndexOf(","));
			}
			outer.put("HeadIds", headId);
			toClient(outer.toString());
		}
		catch (DataAccessException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>查找单据信息异常", e);
		}
		catch (IOException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>回写查询单据信息结果异常", e);
		}
	}
    
    /**
     * 查询单位的累计应收和累计应付，零售不能计入
     * @return
     */
    public void findTotalPay() {
    	try
	    {
			JSONObject outer = new JSONObject();     	
			Double sum = 0.0;
			String getS = model.getSupplierId();
			String supType = model.getSupType(); //单位类型：客户、供应商
			int i = 1;
			if(supType.equals("customer")){ //客户
				i = 1;
			}
			else if(supType.equals("vendor")){ //供应商
				i = -1;
			}
			//进销部分
			sum = sum - (allMoney(getS, "入库", "采购", "合计") - allMoney(getS, "入库", "采购", "实际"))*i;
			sum = sum - (allMoney(getS, "入库", "销售退货", "合计") - allMoney(getS, "入库", "销售退货", "实际"))*i;
			sum = sum + (allMoney(getS, "出库", "销售", "合计") - allMoney(getS, "出库", "销售", "实际"))*i;
			sum = sum + (allMoney(getS, "出库", "采购退货", "合计") - allMoney(getS, "出库", "采购退货", "实际"))*i;
	    	outer.put("getAllMoney", sum);
            toClient(outer.toString());
        }
	    catch (DataAccessException e) 
	    {
	        Log.errorFileSync(">>>>>>>>>>>>>>>>>>>查找异常", e);
        } 
	    catch (IOException e) 
	    {
            Log.errorFileSync(">>>>>>>>>>>>>>>>>>>回写查询结果异常", e);
        }
	}
    
    
    /**
     * 统计总金额
     * @param type
     * @param subType 
     * @param mode 合计或者金额
     * @return
     */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public Double allMoney(String getS, String type, String subType, String mode) {
		Log.infoFileSync("getS:" + getS);
    	Double allMoney = 0.0;
    	String allReturn = "";
		PageUtil<DepotHead> pageUtil = new  PageUtil<DepotHead>();
        pageUtil.setPageSize(0);
        pageUtil.setCurPage(0);
		pageUtil.setAdvSearch(getConditionHead_byEndTime());
        try {        	
        	Integer supplierId = Integer.valueOf(getS);
        	depotHeadService.findAllMoney(pageUtil, supplierId, type, subType, mode);
			allReturn = pageUtil.getPageList().toString();
			allReturn = allReturn.substring(1,allReturn.length()-1);
			if(allReturn.equals("null")){
				allReturn = "0";
			}
		} catch (JshException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        allMoney = Double.parseDouble(allReturn);
        //返回正数，如果负数也转为正数
        if(allMoney<0){
        	allMoney = -allMoney;
        }
		return allMoney;    	     
    }

	/**
	 *入库出库明细接口
	 */
	public void findInDetail(){
		PageUtil pageUtil = new  PageUtil();
		pageUtil.setPageSize(model.getPageSize());
		pageUtil.setCurPage(model.getPageNo());
		Long pid =model.getProjectId();
		String dids =model.getDepotIds();
		Long oId = model.getOrganId();
		String beginTime = model.getBeginTime();
		String endTime = model.getEndTime();
		String type = model.getType();
		try{
			depotHeadService.findInDetail(pageUtil,beginTime,endTime,type,pid,dids,oId);
			List dataList = pageUtil.getPageList();
			JSONObject outer = new JSONObject();
			outer.put("total", pageUtil.getTotalCount());
			//存放数据json数组
			JSONArray dataArray = new JSONArray();
			if(dataList!=null){
				for(Integer i=0; i<dataList.size(); i++){
					JSONObject item = new JSONObject();
					Object dl = dataList.get(i); //获取对象
					Object[] arr = (Object[]) dl; //转为数组
					item.put("number", arr[0]); //单据编号
					item.put("materialName", arr[1]); //商品名称
					item.put("materialModel", arr[2]); //商品型号
					item.put("unitPrice", arr[3]); //单价
					item.put("operNumber", arr[4]); //入库出库数量
					item.put("allPrice", arr[5]); //金额
					item.put("supplierName", arr[6]); //供应商
					item.put("depotName", arr[7]); //仓库
					item.put("operTime", arr[8]); //入库出库日期
					item.put("type", arr[9]); //入库出库日期
					dataArray.add(item);
				}
			}
			outer.put("rows", dataArray);
			//回写查询结果
			toClient(outer.toString());
		}
		catch (JshException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>查找信息异常", e);
		}
		catch (IOException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>回写查询信息结果异常", e);
		}
	}

	/**
	 *入库出库统计接口
	 */
	public void findInOutMaterialCount(){
		PageUtil pageUtil = new  PageUtil();
		pageUtil.setPageSize(model.getPageSize());
		pageUtil.setCurPage(model.getPageNo());
		Long pid =model.getProjectId();
		String dids =model.getDepotIds();
		Long oId = model.getOrganId();
		String beginTime = model.getBeginTime();
		String endTime = model.getEndTime();
		String type = model.getType();
		try{
			depotHeadService.findInOutMaterialCount(pageUtil, beginTime, endTime, type, pid, dids, oId);
			List dataList = pageUtil.getPageList();
			JSONObject outer = new JSONObject();
			outer.put("total", pageUtil.getTotalCount());
			//存放数据json数组
			JSONArray dataArray = new JSONArray();
			if(dataList!=null){
				for(Integer i=0; i<dataList.size(); i++){
					JSONObject item = new JSONObject();
					Object dl = dataList.get(i); //获取对象
					Object[] arr = (Object[]) dl; //转为数组
					item.put("MaterialId", arr[0]); //商品Id
					item.put("mName", arr[1]); //商品名称
					item.put("Model", arr[2]); //商品型号
					item.put("categoryName", arr[3]); //商品类型
					item.put("numSum", arr[4]); //数量
					item.put("priceSum", arr[5]); //金额
					dataArray.add(item);
				}
			}
			outer.put("rows", dataArray);
			//回写查询结果
			toClient(outer.toString());
		}
		catch (JshException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>查找信息异常", e);
		}
		catch (IOException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>回写查询信息结果异常", e);
		}
	}

	public String findMaterialsListByHeaderId(Long headerId){
		String allReturn = "";
		PageUtil pageUtil = new  PageUtil();
		pageUtil.setPageSize(0);
		pageUtil.setCurPage(0);
		try {
			depotHeadService.findMaterialsListByHeaderId(pageUtil, headerId);
			allReturn = pageUtil.getPageList().toString();
			allReturn = allReturn.substring(1,allReturn.length()-1);
			if(allReturn.equals("null")){
				allReturn = "";
			}
		}
		catch (JshException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>查找信息异常", e);
		}
		return allReturn;
	}

	/**
	 *对账单接口
	 */
	public void findStatementAccount(){
		PageUtil pageUtil = new  PageUtil();
		pageUtil.setPageSize(model.getPageSize());
		pageUtil.setCurPage(model.getPageNo());
		String beginTime = model.getBeginTime();
		String endTime = model.getEndTime();
		Long organId = model.getOrganId();
		String supType = model.getSupType(); //单位类型：客户、供应商
		int j = 1;
		if(supType.equals("客户")){ //客户
			j = 1;
		}
		else if(supType.equals("供应商")){ //供应商
			j = -1;
		}
		try{
			depotHeadService.findStatementAccount(pageUtil, beginTime, endTime, organId, supType);
			List dataList = pageUtil.getPageList();
			JSONObject outer = new JSONObject();
			outer.put("total", pageUtil.getTotalCount());
			//存放数据json数组
			JSONArray dataArray = new JSONArray();
			if(dataList!=null){
				for(Integer i=0; i<dataList.size(); i++){
					JSONObject item = new JSONObject();
					Object dl = dataList.get(i); //获取对象
					Object[] arr = (Object[]) dl; //转为数组
					item.put("number", arr[0]); //单据编号
					item.put("type", arr[1]); //类型
					String type = arr[1].toString();
					Double p1 = 0.0;
					Double p2 = 0.0;
					if(arr[2]!=null){
						p1 = Double.parseDouble(arr[2].toString());
					}
					if(arr[3]!=null){
						p2 = Double.parseDouble(arr[3].toString());
					}
					Double allPrice = 0.0;
					if(p1<0) {
						p1 = -p1;
					}
					if(p2<0) {
						p2 = -p2;
					}
					if(type.equals("采购入库")) {
						allPrice = -(p1-p2);
					}
					else if(type.equals("销售退货入库")) {
						allPrice = -(p1-p2);
					}
					else if(type.equals("销售出库")) {
						allPrice = p1-p2;
					}
					else if(type.equals("采购退货出库")) {
						allPrice = p1-p2;
					}
					else if(type.equals("付款")) {
						allPrice = p1+p2;
					}
					else if(type.equals("收款")) {
						allPrice = -(p1+p2);
					}
					else if(type.equals("收入")) {
						allPrice = p1-p2;
					}
					else if(type.equals("支出")) {
						allPrice = -(p1-p2);
					}
					item.put("discountLastMoney", p1); //金额
					item.put("changeAmount", p2); //金额
					item.put("allPrice", String .format("%.2f",allPrice*j)); //计算后的金额
					item.put("supplierName", arr[4]); //供应商
					item.put("operTime", arr[5]); //入库出库日期
					dataArray.add(item);
				}
			}
			outer.put("rows", dataArray);
			//回写查询结果
			toClient(outer.toString());
		}
		catch (JshException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>查找信息异常", e);
		}
		catch (IOException e) {
			Log.errorFileSync(">>>>>>>>>>>>>>>>>>>回写查询信息结果异常", e);
		}
	}

	private Map<String,Object> getConditionByNumber() {
		Map<String,Object> condition = new HashMap<String,Object>();
		condition.put("Number_s_eq",model.getNumber());
		return condition;
	}
    
	/**
	 * 拼接搜索条件
	 * @return
	 */
	private Map<String,Object> getCondition()
    {
        /**
         * 拼接搜索条件
         */
        Map<String,Object> condition = new HashMap<String,Object>();
        condition.put("Type_s_eq",model.getType());
        condition.put("SubType_s_eq",model.getSubType());
        condition.put("Number_s_like",model.getNumber());
		condition.put("Id_s_in",model.getDhIds());
        condition.put("OperTime_s_gteq",model.getBeginTime());
        condition.put("OperTime_s_lteq",model.getEndTime());
        condition.put("Id_s_order","desc");
        return condition;
    }

	private Map<String,Object> buildNumberCondition(String type,String subType,String beginTime,String endTime) {
		Map<String,Object> condition = new HashMap<String,Object>();
		condition.put("Type_s_eq", type);
		condition.put("SubType_s_eq", subType);
		condition.put("OperTime_s_gteq",beginTime);
		condition.put("OperTime_s_lteq",endTime);
		condition.put("Id_s_order","desc");
		return condition;
	}
	
	private Map<String,Object> getConditionHead()
    {
        Map<String,Object> condition = new HashMap<String,Object>();
        condition.put("OperTime_s_lteq",model.getMonthTime() + "-31 00:00:00");
        return condition;
    }

	private Map<String,Object> getConditionHead_Gift_In() {
		Map<String,Object> condition = new HashMap<String,Object>();
		return condition;
	}

	private Map<String,Object> getConditionHead_Gift_Out() {
		Map<String,Object> condition = new HashMap<String,Object>();
		if(model.getProjectId()!=null) {
			condition.put("ProjectId_n_eq", model.getProjectId());
		}
		return condition;
	}

	private Map<String,Object> getConditionHead_byEndTime()
	{
		Map<String,Object> condition = new HashMap<String,Object>();
		condition.put("OperTime_s_lteq", model.getEndTime());
		return condition;
	}
	
	//=============以下spring注入以及Model驱动公共方法，与Action处理无关==================
	public DepotHeadModel getModel()
	{
		return model;
	}
	public void setDepotHeadService(DepotHeadIService depotHeadService)
    {
        this.depotHeadService = depotHeadService;
    }
}
