package controllers

import (
	"XT_New/enums"
	"XT_New/models"
	"XT_New/service"
	"XT_New/utils"
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego"
	"github.com/jinzhu/gorm"
	"reflect"
	"strconv"
	"strings"
	"time"
)

type SupplyOrderApiController struct {
	BaseAuthAPIController
}

func SupplyOrderApiRegistRouters() {
	//获取供应商列表
	beego.Router("/api/supply/getsupplylist", &SupplyOrderApiController{}, "get:GetSupplyList")
	//保存供应商及联系人（用于更改）
	beego.Router("/api/supply/updatesupply", &SupplyOrderApiController{}, "post:UpdateSupply")
	//删除单条联系人
	beego.Router("/api/supply/delcontactone", &SupplyOrderApiController{}, "get:DelContactOne")
	//获取单条供应商和涉及到的联系人记录
	beego.Router("/api/supply/getsupplyandcontactone", &SupplyOrderApiController{}, "get:GetSupplyAndContactOne")
	//获取供应商类别
	beego.Router("/api/supply/getsupplytype", &SupplyOrderApiController{}, "get:GetSupplyType")
	//删除供应商及联系人
	beego.Router("/api/supply/delsupply", &SupplyOrderApiController{}, "post:DelSupply")
	//获取供应商编码
	beego.Router("/api/supply/getsupplycode", &SupplyOrderApiController{}, "get:GetSupplyCode")
	//保存供应商及联系人（用于新增）
	beego.Router("/api/supply/savesupply", &SupplyOrderApiController{}, "post:SaveSupply")

	beego.Router("/api/supply/getinitorder", &SupplyOrderApiController{}, "get:GetInitOrder")
	//保存购货订单
	beego.Router("/api/supply/savepurchaseorder", &SupplyOrderApiController{}, "post:SavePurchaseOrder")
	//获取所有供应商
	beego.Router("/api/supply/getallsupply", &SupplyOrderApiController{}, "get:GetAllSupply")
	//获取供应商订单列表
	beego.Router("/api/supply/getallpurchaseorderlist", &SupplyOrderApiController{}, "get:GetAllPurchaseOrderList")
	//修改购货订单
	beego.Router("/api/supply/updatepurchaseorder", &SupplyOrderApiController{}, "Post:UpdatePurchaseOrder")
	//审核购货订单
	beego.Router("/api/supply/checkpurchaseorder", &SupplyOrderApiController{}, "get:UpdateSupplyWaresing")
	//获取购货订单详情
	beego.Router("/api/supply/getpurchaseorderdetail", &SupplyOrderApiController{}, "get:GetPurchaseOrderDetail")
	//新增购货单
	beego.Router("/api/supply/addgoodorder", &SupplyOrderApiController{}, "post:AddGoodOrder")
	//获取购货单列表
	beego.Router("/api/supply/getallgoodorderlist", &SupplyOrderApiController{}, "Get:GetAllGoodOderList")
	//修改购货订单详情
	beego.Router("/api/supply/getgoodorderdetail", &SupplyOrderApiController{}, "Get:GetGoodOrderDetail")
	//修改购货订单
	beego.Router("/api/supply/updategoodorder", &SupplyOrderApiController{}, "Post:UpdateGoodOrder")
	//删除购货订单
	beego.Router("/api/supply/deletepurchorder", &SupplyOrderApiController{}, "Get:DeletePurchOrder")
	//生成购货单的判断
	beego.Router("/api/supply/getallordercountlist", &SupplyOrderApiController{}, "Get:GetAllOrderCountList")
	// 生成购货单
	beego.Router("/api/supply/getpurchaseorderinfo", &SupplyOrderApiController{}, "Get:GetPurchOrderInfo")
	//反审核 获取关联的购货单数据
	beego.Router("/api/supply/getgoodorderlist", &SupplyOrderApiController{}, "Get:GetGoodOrderList")
	//反审核购货订单
	beego.Router("/api/supply/getreturnorder", &SupplyOrderApiController{}, "Get:GetReturnOrder")
	//判断是否全部入库
	beego.Router("/api/supply/getgoodordercountlist", &SupplyOrderApiController{}, "Get:GetGoodOrderCountList")
	//修改购货订单入库状态
	beego.Router("/api/supply/modefysupplywarehousing", &SupplyOrderApiController{}, "Get:ModefySupplyWarehousing")
	//保存退货单
	beego.Router("/api/supply/savegoodreturnOrder", &SupplyOrderApiController{}, "Post:SaveGoodReturnOrder")
	//获取退货单列表
	beego.Router("/api/supply/getallgoodreturnorderlist", &SupplyOrderApiController{}, "Get:GetAllGoodReturnOrderList")
	//获取退库详情
	beego.Router("/api/supply/getgoodreturndetail", &SupplyOrderApiController{}, "Get:GetGoodReturnDetail")
	//修改退库
	beego.Router("/api/supply/updategoodreturn", &SupplyOrderApiController{}, "Post:UpdateGoodReturn")
	//反审核采购单
	beego.Router("/api/supply/mofygoodorder", &SupplyOrderApiController{}, "Get:ModefyGoodOrder")
	//更改入库状态
	beego.Router("/api/supply/updatesupplywarehousing", &SupplyOrderApiController{}, "Get:UpdateSupplyWarehousing")
	//删除购货单
	beego.Router("/api/supply/deletegoodorder", &SupplyOrderApiController{}, "Get:DeleteGoodOrder")
	//生成采购退货单数据
	beego.Router("/api/supply/getsupplywarehouseoutbyid", &SupplyOrderApiController{}, "Get:GetSupplyWarehouseById")
	//审核采购单
	beego.Router("/api/supply/checkgoodorderbyid", &SupplyOrderApiController{}, "Get:CheckGoodOrderById")
	//审核退货单
	beego.Router("/api/supply/checkreturnorder", &SupplyOrderApiController{}, "Get:CheckReturnOrder")

	//删除采购订单
	beego.Router("api/supply/deletepurchaseorder", &SupplyOrderApiController{}, "Get:DeletePurchaseOrder")
	//删除采购单
	beego.Router("/api/supply/deletegoodorderbyid", &SupplyOrderApiController{}, "Get:DeleteGoodOrderById")
	//删除退货单
	beego.Router("/api/supply/deletereturnorder", &SupplyOrderApiController{}, "Get:DeleteReturnOrder")
	//删除
	beego.Router("/api/supply/deletereturnorderbyid", &SupplyOrderApiController{}, "Get:DeleteReturnOrderById")
	//反审核退货单
	beego.Router("/api/supply/modefyreturnorder", &SupplyOrderApiController{}, "Get:ModefyReturnOrder")

	//获取采购数据
	beego.Router("/api/supply/getgoodorderdetaillist", &SupplyOrderApiController{}, "Get:GetGoodOrderDetailList")
}

//判断前端参数是否为空
func CheckParams(this *SupplyOrderApiController, m *map[string][]string) (map[string]string, error) {
	tmp := make(map[string]string)
	for k, v := range *m {
		t := this.GetString(k)
		if v[0] == "must" && t == "" {
			return nil, fmt.Errorf(v[2] + "不能为空")
		}
		tmp[k] = t
	}
	return tmp, nil
}

//获取供应商列表GetSupplyList
func (this *SupplyOrderApiController) GetSupplyList() {
	var err error
	defer func() {
		if err != nil {
			service.SaveErrs(this.GetAdminUserInfo().CurrentOrgId, this.Ctx.Input, err)
		}
	}()
	ctype, _ := this.GetInt64("ctype") //供应商类别
	page, _ := this.GetInt64("page")   //页码
	limit, _ := this.GetInt64("limit") //每一页查出来的条数
	check := map[string][]string{
		"page":  {"must", "string", "page"},
		"limit": {"must", "string", "limit"},
	}
	_, err = CheckParams(this, &check)
	if err != nil {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
	}
	keyword := this.GetString("keyword") //供应商编号\供应商名称\联系人名字
	orgId := this.GetAdminUserInfo().CurrentOrgId
	//获取分页的数据
	var list []*models.SpSupplierName
	var total int64
	list, total, err = service.GetSupplyList(ctype, page, limit, keyword, orgId)
	//获取供应商类别
	costClassify := "供应商类别"
	drugTypeParent, _ := service.GetDrugDataConfig(0, costClassify)
	drugTypeList, _ := service.GetParentDataConfig(drugTypeParent.ID, orgId)
	tmpmap := make(map[int64]string)    //储存供应商类别
	namemap := make(map[string]string)  //储存首要联系人
	phonemap := make(map[string]string) //手机号
	for i := 0; i < len(drugTypeList); i++ {
		k := int64(drugTypeList[i].Value)
		v := drugTypeList[i].Name
		tmpmap[k] = v
	}
	if err == nil {
		for i := 0; i < len(list); i++ {
			code := list[i].SupplierCode
			fistname, errs := service.FindName(code, orgId)
			if errs != nil && errs.Error() != "record not found" {
				this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
				return
			}
			namemap[code] = fistname.Name
			phonemap[code] = fistname.Phone
		}
		type SpSupplierNameList struct { //基于SpSupplierName结构体修改的，为了方便前端取数据整合了一下，删除了几个用不到的字段，添加了联系人名字和供应商类别两个字段
			ID           int64
			SupplierCode string
			SupplierName string
			SupplierType int64
			VatRate      float64
			Number       string
			Bank         string
			BankAccount  string
			UserOrgId    int64
			Status       int64
			ContactsId   int64
			ConName      string //供应商主要联系人名字
			TypeName     string //供应商类别
			Phone        string //电话
		}
		//初始化该结构体
		tmplist := []*SpSupplierNameList{}
		for i := 0; i < len(list); i++ {
			var typename string //类别名称
			if list[i].SupplierType == 0 {
				typename = ""
			} else {
				typename = tmpmap[list[i].SupplierType]
			}
			tlist := &SpSupplierNameList{
				list[i].ID,
				list[i].SupplierCode,
				list[i].SupplierName,
				list[i].SupplierType,
				list[i].VatRate,
				list[i].Number,
				list[i].Bank,
				list[i].BankAccount,
				list[i].UserOrgId,
				list[i].Status,
				list[i].ContactsId,
				namemap[list[i].SupplierCode],
				typename,
				phonemap[list[i].SupplierCode],
			}
			tmplist = append(tmplist, tlist)
		}
		this.ServeSuccessJSON(map[string]interface{}{
			"list":  tmplist,
			"total": total,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

//保存供应商及联系人（用于更改）
func (this *SupplyOrderApiController) UpdateSupply() {
	orgId := this.GetAdminUserInfo().CurrentOrgId
	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	supplierName := dataBody["suppliername"].(string)
	if supplierName == "" {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "供应商名称不能为空")
		return
	}
	supplierCode := dataBody["suppliercode"].(string)
	if supplierCode == "" {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "供应商编号不能为空")
		return
	}
	supplierid := int64(dataBody["id"].(float64))
	if supplierid == 0 {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "供应商id不能为空")
		return
	}
	//查询供应商的信息
	supply, err := service.GetSupplyOne(supplierid)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	if supplierName != supply.SupplierName {
		//判断供应商名称是否有重复的
		sbool, _ := service.FindSupplierName(supplierName, orgId)
		if sbool { //有重复的
			this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "供应商名称重复")
			return
		}
	}
	if supplierCode != supply.SupplierCode {
		//判断供应商编号是否有重复的
		codebool, _ := service.FindSupplierCode(supplierCode, supplierid, orgId)
		if codebool {
			this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "供应商编号重复")
			return
		}
	}
	if dataBody["suppliertype"] == "" || dataBody["suppliertype"] == 0 {
		var tmp float64 = 0
		dataBody["suppliertype"] = tmp
	}
	if dataBody["vatrate"] == "" {
		dataBody["vatrate"] = 0
	}
	supplierType := int64(dataBody["suppliertype"].(float64)) //供应商类别
	var tmpvarrate float64
	datavarrate := dataBody["vatrate"]
	switch datavarrate.(type) {
	case float64:
		tmpvarrate = datavarrate.(float64)
	case string:
		tmpvarrate, _ = strconv.ParseFloat(dataBody["vatrate"].(string), 64)
	}
	vatRate := tmpvarrate                           //增值税税率
	number := dataBody["number"].(string)           //纳税人识别号
	bank := dataBody["bank"].(string)               //开户银行
	bankAccount := dataBody["bankaccount"].(string) //银行账号
	tmodify := this.GetAdminUserInfo().AdminUser.Id //修改者
	//保存联系人
	if dataBody["contacts"] != nil && reflect.TypeOf(dataBody["contacts"]).String() == "[]interface {}" {
		thisStockIn, _ := dataBody["contacts"].([]interface{})
		if len(thisStockIn) > 0 {
			for _, v := range thisStockIn { //这个循环是用来检测当填了手机号时联系人不能为空
				vtem := v.(map[string]interface{})
				if vtem["phone"].(string) != "" && vtem["name"].(string) == "" {
					this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "联系人不能为空")
					return
				}
			}
			if len(thisStockIn) == 1 { //当只有一条联系人时强制设为首要联系人
				for _, item := range thisStockIn {
					items := item.(map[string]interface{})
					items["is_first"] = 1
					//如果电话和联系人都为空，不保存联系人
					if items["phone"] == "" && items["name"] == nil {
						upsupply := models.SpSupplierName{
							ID:           supplierid,
							SupplierCode: supplierCode,
							SupplierName: supplierName,
							SupplierType: supplierType,
							VatRate:      vatRate,
							Number:       number,
							Bank:         bank,
							BankAccount:  bankAccount,
							UserOrgId:    orgId,
							Status:       1,
							Mtime:        time.Now().Unix(),
							Modify:       tmodify,
						}
						err = service.UpdateSupplyName(upsupply)
						if err != nil {
							this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
							return
						}
						this.ServeSuccessJSON(map[string]interface{}{
							"list": "保存成功",
						})
						return
					}
				}
			}
			err = service.UpdateSupplyAndContact(thisStockIn, supplierid, orgId, supplierType, tmodify, supplierCode, supplierName, number, bank, bankAccount, vatRate)
			if err != nil {
				this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
				return
			}
		} else {
			//如果联系人是空的，直接保存供应商
			//更新供应商
			upsupply := models.SpSupplierName{
				ID:           supplierid,
				SupplierCode: supplierCode,
				SupplierName: supplierName,
				SupplierType: supplierType,
				VatRate:      vatRate,
				Number:       number,
				Bank:         bank,
				BankAccount:  bankAccount,
				Status:       1,
				Mtime:        time.Now().Unix(),
				Modify:       tmodify,
			}
			err = service.UpdateSupplyName(upsupply)
			if err != nil {
				this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
				return
			}

		}
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": "保存成功",
	})
	return
}

//获取单条供应商和涉及到的联系人记录
func (this *SupplyOrderApiController) GetSupplyAndContactOne() {
	orgId := this.GetAdminUserInfo().CurrentOrgId
	id, _ := this.GetInt64("id")
	check := map[string][]string{
		"id": {"must", "string", "id"},
	}
	_, err := CheckParams(this, &check)
	if err != nil {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
	}
	supply, contact, err := service.GetSupplyAndContactOne(id, orgId)
	//获取供应商类别
	costClassify := "供应商类别"
	drugTypeParent, _ := service.GetDrugDataConfig(0, costClassify)
	drugTypeList, _ := service.GetParentDataConfig(drugTypeParent.ID, orgId)
	tmpmap := make(map[int64]string) //储存供应商类别
	for i := 0; i < len(drugTypeList); i++ {
		k := int64(drugTypeList[i].Value)
		v := drugTypeList[i].Name
		tmpmap[k] = v
	}
	type SpSupplierNameList struct { //基于SpSupplierName结构体修改的，为了方便前端取数据整合了一下，删除了几个用不到的字段，添加了联系人名字和供应商类别两个字段
		Id           int64   `json:"id"`
		Suppliercode string  `json:"suppliercode"`
		Suppliername string  `json:"suppliername"`
		Suppliertype int64   `json:"suppliertype"`
		Vatrate      float64 `json:"vatrate"`
		Number       string  `json:"number"`
		Bank         string  `json:"bank"`
		Bankaccount  string  `json:"bankaccount"`
		Userorgid    int64   `json:"userorgid"`
		Status       int64   `json:"status"`
		Contactsid   int64   `json:"contactsid"`
		Typename     string  `json:"typename"` //供应商类别
	}

	var typename string //类别名称
	if supply.SupplierType == 0 {
		typename = ""
	} else {
		typename = tmpmap[supply.SupplierType]
	}
	tlist := &SpSupplierNameList{
		supply.ID,
		supply.SupplierCode,
		supply.SupplierName,
		supply.SupplierType,
		supply.VatRate,
		supply.Number,
		supply.Bank,
		supply.BankAccount,
		supply.UserOrgId,
		supply.Status,
		supply.ContactsId,
		typename,
	}
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	fmt.Println(tlist)
	this.ServeSuccessJSON(map[string]interface{}{
		"supply":  tlist,
		"contact": contact,
	})
	return
}

//获取供应商类别
func (this *SupplyOrderApiController) GetSupplyType() {
	orgId := this.GetAdminUserInfo().CurrentOrgId
	costClassify := "供应商类别"
	drugTypeParent, _ := service.GetDrugDataConfig(0, costClassify)
	drugTypeList, _ := service.GetParentDataConfig(drugTypeParent.ID, orgId)
	this.ServeSuccessJSON(map[string]interface{}{
		"list": drugTypeList,
	})
	return
}

//删除供应商及联系人
func (this *SupplyOrderApiController) DelSupply() {
	orgId := this.GetAdminUserInfo().CurrentOrgId
	//拿到供应商的id
	suid, _ := this.GetInt64("id")
	if suid == 0 {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "供应商id不能为空")
		return
	}
	supply := models.SpSupplierName{
		ID: suid,
	}
	shiwu, err := service.DelSupply(supply, orgId)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list":  "删除成功",
		"shiwu": shiwu,
	})
	return
}

//删除单条联系人记录
func (this *SupplyOrderApiController) DelContactOne() {
	id, _ := this.GetInt64("id")
	if id == 0 {
		this.ServeSuccessJSON(map[string]interface{}{
			"list": "删除成功,没有走数据库",
		})
		return
	}
	err := service.DelContactOne(id)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": "删除成功",
	})
	return
}

//获取供应商编码
func (this *SupplyOrderApiController) GetSupplyCode() {
	orgId := this.GetAdminUserInfo().CurrentOrgId
	supply, err := service.GetSuppliyCode(orgId)
	if err != nil {
		return
	}
	if len(supply) == 0 { //如果数据库中没有gys类型的编码则设置默认值
		supply = []*models.SpSupplierName{
			{
				SupplierCode: "gys001",
			},
		}
	} else { //获取数据库中最大的编码值，并加一
		tmp := supply[0].SupplierCode
		tmp = tmp[3:]
		var code int
		code, err = strconv.Atoi(tmp)
		code++
		tmp = strconv.Itoa(code)
		for len(tmp) < 3 {
			tmp = "0" + tmp
		}
		tmp = "gys" + tmp
		supply[0].SupplierCode = tmp
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"supplycode": supply,
	})
	return
}

//保存供应商（用于新增）
func (this *SupplyOrderApiController) SaveSupply() {
	orgId := this.GetAdminUserInfo().CurrentOrgId
	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	supplierName := dataBody["suppliername"].(string)
	if supplierName == "" {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "供应商名称不能为空")
		return
	}
	//判断供应商名称是否有重复的
	sbool, _ := service.FindSupplierName(supplierName, orgId)
	if sbool { //有重复的
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "供应商名称重复")
		return
	}
	supplierCode := dataBody["suppliercode"].(string) //供应商编码
	if supplierCode == "" {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "供应商编号不能为空")
		return
	}
	//判断供应商编号是否有重复的
	codebool, _ := service.FindSupplierCodes(supplierCode, orgId)
	if codebool {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "供应商编号重复")
		return
	}
	if dataBody["suppliertype"] == "" {
		var tmp int64 = 0
		dataBody["suppliertype"] = tmp
	}
	if dataBody["vatrate"] == "" {
		dataBody["vatrate"] = "0"
	}
	if dataBody["suppliertype"] == "" || dataBody["suppliertype"] == 0 {
		var tmp float64 = 0
		dataBody["suppliertype"] = tmp
	}
	supplierType := int64(dataBody["suppliertype"].(float64)) //供应商类别
	var tmpvarrate float64
	datavarrate := dataBody["vatrate"]
	switch datavarrate.(type) {
	case float64:
		tmpvarrate = datavarrate.(float64)
	case string:
		tmpvarrate, _ = strconv.ParseFloat(dataBody["vatrate"].(string), 64)
	}
	vatRate := tmpvarrate //增值税税率
	number, _ := dataBody["number"].(string)
	bank := dataBody["bank"].(string)
	bankAccount := dataBody["bankaccount"].(string)
	tcreater := this.GetAdminUserInfo().AdminUser.Id
	//保存联系人
	if dataBody["contacts"] != nil && reflect.TypeOf(dataBody["contacts"]).String() == "[]interface {}" {
		thisStockIn, _ := dataBody["contacts"].([]interface{})
		if len(thisStockIn) > 0 {
			for _, v := range thisStockIn { //这个循环是用来检测当填了手机号时联系人不能为空
				vtem := v.(map[string]interface{})
				if vtem["phone"] != "" && vtem["name"] == nil {
					this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "联系人不能为空")
					return
				}
			}
			if len(thisStockIn) == 1 { //当只有一条联系人时强制设为首要联系人,
				for _, item := range thisStockIn {
					items := item.(map[string]interface{})
					items["is_first"] = 1
					//如果电话和联系人都为空，不保存联系人
					if items["phone"] == "" && items["name"] == nil {
						supply := models.SpSupplierName{
							SupplierCode: supplierCode,
							SupplierName: supplierName,
							SupplierType: supplierType,
							VatRate:      vatRate,
							Number:       number,
							Bank:         bank,
							BankAccount:  bankAccount,
							UserOrgId:    orgId,
							Status:       1,
							Ctime:        time.Now().Unix(),
							Mtime:        0,
							Creater:      tcreater,
							Modify:       tcreater,
						}
						err = service.SaveSupply(supply)
						if err != nil {
							this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
							return
						}
						this.ServeSuccessJSON(map[string]interface{}{
							"list": "保存成功",
						})
						return
					}
				}
			}
			err = service.SaveSupplyAndContact(thisStockIn, orgId, supplierType, tcreater, supplierCode, supplierName, number, bank, bankAccount, vatRate)
			if err != nil {
				this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
				return
			}
		} else {
			//如果联系人是空的，这里直接保存供应商
			supply := models.SpSupplierName{
				SupplierCode: supplierCode,
				SupplierName: supplierName,
				SupplierType: supplierType,
				VatRate:      vatRate,
				Number:       number,
				Bank:         bank,
				BankAccount:  bankAccount,
				UserOrgId:    orgId,
				Status:       1,
				Ctime:        time.Now().Unix(),
				Mtime:        0,
				Creater:      tcreater,
				Modify:       tcreater,
			}
			err = service.SaveSupply(supply)
			if err != nil {
				this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
				return
			}
		}
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": "保存成功",
	})
	return
}

func (this *SupplyOrderApiController) GetInitOrder() {

	orgId := this.GetAdminUserInfo().CurrentOrgId
	//获取药品库数据
	baseList, _ := service.GetSupplyDrugList(orgId)

	goodList, _ := service.GetSupplyGoodList(orgId)

	manufactuerList, _ := service.GetAllManufacturerList(orgId)

	goodTypeList, _ := service.GetAllGoodType(orgId)

	supplyList, _ := service.GetSupplierList(orgId)

	var drugType = "药品类型"
	drugTypeParent, _ := service.GetDrugDataConfig(0, drugType)
	drugTypeList, _ := service.GetParentDataConfig(drugTypeParent.ID, orgId)
	this.ServeSuccessJSON(map[string]interface{}{
		"drugList":        baseList,
		"goodList":        goodList,
		"manufactuerList": manufactuerList,
		"goodTypeList":    goodTypeList,
		"drugTypeList":    drugTypeList,
		"supplyList":      supplyList,
	})
	return
}

func (this *SupplyOrderApiController) SavePurchaseOrder() {

	supplier_id, _ := this.GetInt64("supplier_name")
	start_time := this.GetString("start_time")
	end_time := this.GetString("end_time")
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	var startTime int64
	if len(start_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		if err != nil {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		startTime = theTime.Unix()
	}
	var endTime int64
	if len(end_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 23:59:59", loc)
		if err != nil {
			utils.ErrorLog(err.Error())
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		endTime = theTime.Unix()
	}

	rate_of_concession := this.GetString("rate_of_concession")
	rate_of_concession_float, _ := strconv.ParseFloat(rate_of_concession, 64)
	discount_amount := this.GetString("discount_amount")
	discount_amount_float, _ := strconv.ParseFloat(discount_amount, 64)

	dataBody := make(map[string]interface{}, 0)

	err := json.Unmarshal(this.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	//生成购货订单
	timeStr := time.Now().Format("2006-01-02")
	timeArr := strings.Split(timeStr, "-")
	orgId := this.GetAdminUserInfo().CurrentOrgId
	total, _ := service.FindAllSupplyOrder(orgId)
	total = total + 1
	warehousing_order := "CGDD" + timeArr[0] + timeArr[1] + timeArr[2] + "00" + strconv.FormatInt(total, 10)
	recordDateStr := time.Now().Format("2006-01-02")
	recordDate, parseDateErr := utils.ParseTimeStringToTime("2006-01-02", recordDateStr)
	fmt.Scan("parseDateErr", parseDateErr)
	record_date := recordDate.Unix()
	return_remake := dataBody["return_remake"].(string)
	info := models.SupplierWarehouseInfo{
		Number:           warehousing_order,
		UserOrgId:        orgId,
		Creater:          this.GetAdminUserInfo().AdminUser.Id,
		Ctime:            time.Now().Unix(),
		Mtime:            0,
		Status:           1,
		RecordDate:       record_date,
		IsCheck:          2,
		RateOfConcession: rate_of_concession_float,
		DiscountAmount:   discount_amount_float,
		DocumentDate:     startTime,
		DeliveryDate:     endTime,
		SupplierId:       supplier_id,
		IsWarehouse:      2,
		ReturnRemake:     return_remake,
	}
	err = service.CreateSupplyWarehouse(info)
	warehouseInfo, _ := service.FindLastSupplyWarehouseInfo(orgId)
	var warehousingInfo []*models.SupplierWarehousingInfoOrder

	if dataBody["stockIn"] != nil && reflect.TypeOf(dataBody["stockIn"]).String() == "[]interface {}" {
		thisStockIn, _ := dataBody["stockIn"].([]interface{})
		if len(thisStockIn) > 0 {
			for _, item := range thisStockIn {
				items := item.(map[string]interface{})

				if items["project_id"] == nil || reflect.TypeOf(items["project_id"]).String() != "float64" {
					utils.ErrorLog("project_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				project_id := int64(items["project_id"].(float64))

				if items["supply_count"] == nil || reflect.TypeOf(items["supply_count"]).String() != "float64" {
					utils.ErrorLog("supply_count")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_count := int64(items["supply_count"].(float64))

				if items["supply_license_number"] == nil || reflect.TypeOf(items["supply_license_number"]).String() != "string" {
					utils.ErrorLog("supply_license_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				supply_license_number := items["supply_license_number"].(string)

				if items["supply_price"] == nil || reflect.TypeOf(items["supply_price"]).String() != "string" {
					utils.ErrorLog("supply_price")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_price := items["supply_price"].(string)

				supply_price_float, _ := strconv.ParseFloat(supply_price, 64)

				if items["supply_remake"] == nil || reflect.TypeOf(items["supply_remake"]).String() != "string" {
					utils.ErrorLog("supply_remake")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				supply_remake := items["supply_remake"].(string)

				if items["supply_total_price"] == nil || reflect.TypeOf(items["supply_total_price"]).String() != "string" {
					utils.ErrorLog("supply_total_price")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_total_price := items["supply_total_price"].(string)

				supply_total_price_float, _ := strconv.ParseFloat(supply_total_price, 64)
				if items["type"] == nil || reflect.TypeOf(items["type"]).String() != "float64" {
					utils.ErrorLog("type")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				is_source := int64(items["type"].(float64))

				if items["supply_type"] == nil || reflect.TypeOf(items["supply_type"]).String() != "string" {
					utils.ErrorLog("supply_type")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				supply_type := items["supply_type"].(string)

				if items["supply_specification_name"] == nil || reflect.TypeOf(items["supply_specification_name"]).String() != "string" {
					utils.ErrorLog("supply_specification_name")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				supply_specification_name := items["supply_specification_name"].(string)

				if items["supply_total"] == nil || reflect.TypeOf(items["supply_total"]).String() != "string" {
					utils.ErrorLog("supply_total")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				supply_total := items["supply_total"].(string)

				if items["supply_manufacturer"] == nil || reflect.TypeOf(items["supply_manufacturer"]).String() != "string" {
					utils.ErrorLog("supply_manufacturer")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				supply_manufacturer := items["supply_manufacturer"].(string)

				if items["name"] == nil || reflect.TypeOf(items["name"]).String() != "string" {
					utils.ErrorLog("name")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				name := items["name"].(string)

				if items["supply_unit"] == nil || reflect.TypeOf(items["supply_unit"]).String() != "string" {
					utils.ErrorLog("supply_unit")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				supply_unit := items["supply_unit"].(string)

				if items["manufacturer_id"] == nil || reflect.TypeOf(items["manufacturer_id"]).String() != "float64" {
					utils.ErrorLog("manufacturer_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				manufacturer_id := int64(items["manufacturer_id"].(float64))

				order := models.SupplierWarehousingInfoOrder{
					OrderNumber:             warehousing_order,
					IsSource:                is_source,
					Count:                   supply_count,
					Price:                   supply_price_float,
					Amount:                  supply_total_price_float,
					Remark:                  supply_remake,
					UserOrgId:               orgId,
					Ctime:                   time.Now().Unix(),
					Status:                  1,
					Mtime:                   0,
					WarehousingId:           warehouseInfo.ID,
					ProjectId:               project_id,
					SupplyLicenseNumber:     supply_license_number,
					SupplyType:              supply_type,
					SupplySpecificationName: supply_specification_name,
					SupplyTotal:             supply_total,
					SupplyManufacturer:      supply_manufacturer,
					Name:                    name,
					SupplyUnit:              supply_unit,
					ManufacturerId:          manufacturer_id,
				}

				warehousingInfo = append(warehousingInfo, &order)
			}
		}
	}

	for _, item := range warehousingInfo {
		err = service.CreateSupplyWarehousingOrder(item)
	}

	//查询
	orderInfo, err := service.GetSupplyWarehousingOrderInfo(warehouseInfo.ID)
	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"order":         warehousingInfo,
			"warehouseInfo": warehouseInfo,
			"orderInfo":     orderInfo,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) GetAllSupply() {

	orgId := this.GetAdminUserInfo().CurrentOrgId
	appId := this.GetAdminUserInfo().CurrentAppId
	supplyList, err := service.GetSupplierList(orgId)
	doctorList, err := service.GetAllDoctorSix(orgId, appId)
	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"supplyList": supplyList,
			"doctorList": doctorList,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) GetAllPurchaseOrderList() {

	check_id, _ := this.GetInt64("check_id")
	start_time := this.GetString("start_time")
	end_time := this.GetString("end_time")
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	var startTime int64
	if len(start_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		if err != nil {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		startTime = theTime.Unix()
	}
	var endTime int64
	if len(end_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 23:59:59", loc)
		if err != nil {
			utils.ErrorLog(err.Error())
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		endTime = theTime.Unix()
	}
	keyword := this.GetString("keyword")

	page, _ := this.GetInt64("page")

	limit, _ := this.GetInt64("limit")
	orgId := this.GetAdminUserInfo().CurrentOrgId
	list, total, err := service.GetAllPurchaseOrderList(check_id, startTime, endTime, keyword, page, limit, orgId)

	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"list":  list,
			"total": total,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) UpdatePurchaseOrder() {
	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	supplier_id, _ := this.GetInt64("supplier_name")
	start_time := this.GetString("start_time")
	end_time := this.GetString("end_time")
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	var startTime int64
	if len(start_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		if err != nil {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		startTime = theTime.Unix()
	}
	var endTime int64
	if len(end_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 00:00:00", loc)
		if err != nil {
			utils.ErrorLog(err.Error())
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		endTime = theTime.Unix()
	}

	rate_of_concession := this.GetString("rate_of_concession")
	rate_of_concession_float, _ := strconv.ParseFloat(rate_of_concession, 64)
	discount_amount := this.GetString("discount_amount")
	discount_amount_float, _ := strconv.ParseFloat(discount_amount, 64)
	warehousing_id, _ := this.GetInt64("id")
	number := this.GetString("number")
	return_remake := dataBody["return_remake"].(string)
	orgId := this.GetAdminUserInfo().CurrentOrgId
	info := models.SupplierWarehouseInfo{
		RateOfConcession: rate_of_concession_float,
		DiscountAmount:   discount_amount_float,
		DocumentDate:     startTime,
		DeliveryDate:     endTime,
		SupplierId:       supplier_id,
		Mtime:            time.Now().Unix(),
		ReturnRemake:     return_remake,
	}
	service.ModefySupplyWarehouseInfo(warehousing_id, info)

	var warehousingInfo []*models.SupplierWarehousingInfoOrder
	var updateWarehousingInfo []*models.SupplierWarehousingInfoOrder
	if dataBody["stockIn"] != nil && reflect.TypeOf(dataBody["stockIn"]).String() == "[]interface {}" {
		thisStockIn, _ := dataBody["stockIn"].([]interface{})
		if len(thisStockIn) > 0 {
			for _, item := range thisStockIn {
				items := item.(map[string]interface{})

				if items["id"] == nil || reflect.TypeOf(items["id"]).String() != "float64" {
					utils.ErrorLog("id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				id := int64(items["id"].(float64))

				if items["project_id"] == nil || reflect.TypeOf(items["project_id"]).String() != "float64" {
					utils.ErrorLog("project_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				project_id := int64(items["project_id"].(float64))

				if items["supply_count"] == nil || reflect.TypeOf(items["supply_count"]).String() != "float64" {
					utils.ErrorLog("supply_count")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_count := int64(items["supply_count"].(float64))

				if items["supply_license_number"] == nil || reflect.TypeOf(items["supply_license_number"]).String() != "string" {
					utils.ErrorLog("supply_license_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				supply_license_number := items["supply_license_number"].(string)

				if items["supply_price"] == nil || reflect.TypeOf(items["supply_price"]).String() != "string" {
					utils.ErrorLog("supply_price")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_price := items["supply_price"].(string)

				supply_price_float, _ := strconv.ParseFloat(supply_price, 64)

				if items["supply_remake"] == nil || reflect.TypeOf(items["supply_remake"]).String() != "string" {
					utils.ErrorLog("supply_remake")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				supply_remake := items["supply_remake"].(string)

				if items["supply_total_price"] == nil || reflect.TypeOf(items["supply_total_price"]).String() != "string" {
					utils.ErrorLog("supply_total_price")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_total_price := items["supply_total_price"].(string)

				supply_total_price_float, _ := strconv.ParseFloat(supply_total_price, 64)
				if items["type"] == nil || reflect.TypeOf(items["type"]).String() != "float64" {
					utils.ErrorLog("type")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				is_source := int64(items["type"].(float64))

				if items["supply_type"] == nil || reflect.TypeOf(items["supply_type"]).String() != "string" {
					utils.ErrorLog("supply_type")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				supply_type := items["supply_type"].(string)

				if items["supply_specification_name"] == nil || reflect.TypeOf(items["supply_specification_name"]).String() != "string" {
					utils.ErrorLog("supply_specification_name")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				supply_specification_name := items["supply_specification_name"].(string)

				if items["supply_total"] == nil || reflect.TypeOf(items["supply_total"]).String() != "string" {
					utils.ErrorLog("supply_total")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				supply_total := items["supply_total"].(string)

				if items["supply_manufacturer"] == nil || reflect.TypeOf(items["supply_manufacturer"]).String() != "string" {
					utils.ErrorLog("supply_manufacturer")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				supply_manufacturer := items["supply_manufacturer"].(string)

				if items["name"] == nil || reflect.TypeOf(items["name"]).String() != "string" {
					utils.ErrorLog("name")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				name := items["name"].(string)

				if items["supply_unit"] == nil || reflect.TypeOf(items["supply_unit"]).String() != "string" {
					utils.ErrorLog("supply_unit")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}

				supply_unit := items["supply_unit"].(string)

				if items["manufacturer_id"] == nil || reflect.TypeOf(items["manufacturer_id"]).String() != "float64" {
					utils.ErrorLog("manufacturer_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				manufacturer_id := int64(items["manufacturer_id"].(float64))
				if id > 0 {
					order := models.SupplierWarehousingInfoOrder{
						ID:                      id,
						IsSource:                is_source,
						Count:                   supply_count,
						Price:                   supply_price_float,
						Amount:                  supply_total_price_float,
						Remark:                  supply_remake,
						Ctime:                   time.Now().Unix(),
						Status:                  1,
						Mtime:                   0,
						ProjectId:               project_id,
						SupplyLicenseNumber:     supply_license_number,
						SupplyType:              supply_type,
						SupplySpecificationName: supply_specification_name,
						SupplyTotal:             supply_total,
						SupplyManufacturer:      supply_manufacturer,
						Name:                    name,
						SupplyUnit:              supply_unit,
						ManufacturerId:          manufacturer_id,
					}

					updateWarehousingInfo = append(updateWarehousingInfo, &order)
				}

				if id == 0 {

					order := models.SupplierWarehousingInfoOrder{
						OrderNumber:             number,
						IsSource:                is_source,
						Count:                   supply_count,
						Price:                   supply_price_float,
						Amount:                  supply_total_price_float,
						Remark:                  supply_remake,
						UserOrgId:               orgId,
						Ctime:                   time.Now().Unix(),
						Status:                  1,
						Mtime:                   0,
						WarehousingId:           warehousing_id,
						ProjectId:               project_id,
						SupplyLicenseNumber:     supply_license_number,
						SupplyType:              supply_type,
						SupplySpecificationName: supply_specification_name,
						SupplyTotal:             supply_total,
						SupplyManufacturer:      supply_manufacturer,
						Name:                    name,
						SupplyUnit:              supply_unit,
						ManufacturerId:          manufacturer_id,
					}
					warehousingInfo = append(warehousingInfo, &order)
				}

			}
		}
		if len(warehousingInfo) > 0 {
			for _, item := range warehousingInfo {
				service.CreateSupplyWarehousingOrder(item)
			}

		}
		if len(updateWarehousingInfo) > 0 {
			for _, item := range updateWarehousingInfo {
				service.ModifySupplyWarehouseOrder(item)
			}

		}
		//查询
		orderInfo, _ := service.GetSupplyWarehousingOrderInfo(warehousing_id)
		this.ServeSuccessJSON(map[string]interface{}{
			"warehousingInfo": warehousingInfo,
			"orderInfo":       orderInfo,
		})

	}
}

func (this *SupplyOrderApiController) UpdateSupplyWaresing() {

	id, _ := this.GetInt64("id")
	recordDateStr := time.Now().Format("2006-01-02")
	recordDate, _ := utils.ParseTimeStringToTime("2006-01-02", recordDateStr)

	record_date := recordDate.Unix()
	checker := this.GetAdminUserInfo().AdminUser.Id
	info := models.SupplierWarehouseInfo{
		Mtime:     time.Now().Unix(),
		Status:    1,
		IsCheck:   1,
		Checker:   checker,
		CheckTime: record_date,
	}
	parseDateErr := service.UpdateSupplyWaresing(id, info)
	if parseDateErr == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"info": info,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) GetPurchaseOrderDetail() {

	id, _ := this.GetInt64("id")
	info, _ := service.GetPurchaseOrderDetail(id)
	//查询
	orderInfo, err := service.GetSupplyWarehousingOrderInfo(id)
	orgId := this.GetAdminUserInfo().CurrentOrgId
	supplyList, _ := service.GetSupplierList(orgId)
	//获取药品库数据
	baseList, _ := service.GetSupplyDrugList(orgId)

	goodList, _ := service.GetSupplyGoodList(orgId)

	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"info":       info,
			"orderInfo":  orderInfo,
			"supplyList": supplyList,
			"baseList":   baseList,
			"goodList":   goodList,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) AddGoodOrder() {
	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	supplier_id, _ := this.GetInt64("supplier_id")
	start_time := this.GetString("start")
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	var startTime int64
	if len(start_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		if err != nil {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		startTime = theTime.Unix()
	}
	arrerage := this.GetString("arrerage")
	arrerage_float, _ := strconv.ParseFloat(arrerage, 64)
	payment := this.GetString("payment")
	payment_float, _ := strconv.ParseFloat(payment, 64)
	warehousing_id, _ := this.GetInt64("warehousing_id")
	number := this.GetString("number")
	rate_of_concession := this.GetString("rate_of_concession")
	rate_of_concession_float, _ := strconv.ParseFloat(rate_of_concession, 64)
	discount_amount := this.GetString("discount_amount")
	discount_amount_float, _ := strconv.ParseFloat(discount_amount, 64)
	return_remake := dataBody["return_remake"].(string)
	orgId := this.GetAdminUserInfo().CurrentOrgId
	creater := this.GetAdminUserInfo().AdminUser.Id
	//生成购货单
	timeStr := time.Now().Format("2006-01-02")
	timeArr := strings.Split(timeStr, "-")
	total, _ := service.FindAllSupplyWarehouseOutOrder(orgId)
	total = total + 1
	warehousing_order := "CG" + timeArr[0] + timeArr[1] + timeArr[2] + "00" + strconv.FormatInt(total, 10)
	recordDateStr := time.Now().Format("2006-01-02")
	recordDate, _ := utils.ParseTimeStringToTime("2006-01-02", recordDateStr)

	warehouse_out := models.SpSupplierWarehouseOut{
		Number:           number,
		UserOrgId:        orgId,
		Creater:          creater,
		Ctime:            time.Now().Unix(),
		Mtime:            0,
		Status:           1,
		RecordDate:       recordDate.Unix(),
		IsCheck:          2,
		WarehousingId:    warehousing_id,
		GoodNumber:       warehousing_order,
		Arrearage:        arrerage_float,
		Payment:          payment_float,
		RateOfConcession: rate_of_concession_float,
		DiscountAmount:   discount_amount_float,
		DocumentDate:     startTime,
		SupplierId:       supplier_id,
		Checker:          0,
		CheckTime:        0,
		ReturnRemake:     return_remake,
	}

	service.CreateSupplyWarehouseOut(warehouse_out)

	//获取最后一条
	warehouseOut, _ := service.FindSupplyWarehouseOutById(orgId)

	var warehousingOut []*models.SpSupplierWarehousingOutOrder
	if dataBody["stockIn"] != nil && reflect.TypeOf(dataBody["stockIn"]).String() == "[]interface {}" {
		thisStockIn, _ := dataBody["stockIn"].([]interface{})
		if len(thisStockIn) > 0 {
			for _, item := range thisStockIn {
				items := item.(map[string]interface{})

				if items["supply_count"] == nil || reflect.TypeOf(items["supply_count"]).String() != "float64" {
					utils.ErrorLog("supply_count")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_count := int64(items["supply_count"].(float64))

				if items["id"] == nil || reflect.TypeOf(items["id"]).String() != "float64" {
					utils.ErrorLog("id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				id := int64(items["id"].(float64))

				if items["manufacturer_id"] == nil || reflect.TypeOf(items["manufacturer_id"]).String() != "float64" {
					utils.ErrorLog("manufacturer_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				manufacturer_id := int64(items["manufacturer_id"].(float64))

				if items["name"] == nil || reflect.TypeOf(items["name"]).String() != "string" {
					utils.ErrorLog("name")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				name := items["name"].(string)

				if items["order_number"] == nil || reflect.TypeOf(items["order_number"]).String() != "string" {
					utils.ErrorLog("order_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				order_number := items["order_number"].(string)

				if items["supply_price"] == nil || reflect.TypeOf(items["supply_price"]).String() != "string" {
					utils.ErrorLog("supply_price")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_price := items["supply_price"].(string)

				price_float, _ := strconv.ParseFloat(supply_price, 64)

				if items["min_price"] == nil || reflect.TypeOf(items["min_price"]).String() != "string" {
					utils.ErrorLog("min_price")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				min_price := items["min_price"].(string)

				min_price_float, _ := strconv.ParseFloat(min_price, 64)

				if items["supply_total_price"] == nil || reflect.TypeOf(items["supply_total_price"]).String() != "string" {
					utils.ErrorLog("supply_total_price")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_total_price := items["supply_total_price"].(string)

				supply_total_price_float, _ := strconv.ParseFloat(supply_total_price, 64)

				if items["project_id"] == nil || reflect.TypeOf(items["project_id"]).String() != "float64" {
					utils.ErrorLog("project_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				project_id := int64(items["project_id"].(float64))

				if items["supply_remake"] == nil || reflect.TypeOf(items["supply_remake"]).String() != "string" {
					utils.ErrorLog("supply_remake")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_remake := items["supply_remake"].(string)

				if items["supply_batch_number"] == nil || reflect.TypeOf(items["supply_batch_number"]).String() != "string" {
					utils.ErrorLog("supply_batch_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_batch_number := items["supply_batch_number"].(string)

				var supply_expiry_date_time int64
				if items["supply_expiry_date"] == nil || reflect.TypeOf(items["supply_expiry_date"]).String() != "string" {
					utils.ErrorLog("supply_expiry_date")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_expiry_date := items["supply_expiry_date"].(string)

				if len(supply_expiry_date) > 0 {
					theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", supply_expiry_date+" 00:00:00", loc)
					if err != nil {
						this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
						return
					}
					supply_expiry_date_time = theTime.Unix()
				}

				if items["supply_license_number"] == nil || reflect.TypeOf(items["supply_license_number"]).String() != "string" {
					utils.ErrorLog("supply_license_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_license_number := items["supply_license_number"].(string)

				var supply_product_date_time int64
				if items["supply_product_date"] == nil || reflect.TypeOf(items["supply_product_date"]).String() != "string" {
					utils.ErrorLog("supply_product_date")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_product_date := items["supply_product_date"].(string)

				if len(supply_product_date) > 0 {
					theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", supply_product_date+" 00:00:00", loc)
					if err != nil {
						this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
						return
					}
					supply_product_date_time = theTime.Unix()
				}

				if items["supply_specification_name"] == nil || reflect.TypeOf(items["supply_specification_name"]).String() != "string" {
					utils.ErrorLog("supply_specification_name")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_specification_name := items["supply_specification_name"].(string)

				if items["supply_total"] == nil || reflect.TypeOf(items["supply_total"]).String() != "string" {
					utils.ErrorLog("supply_total")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_total := items["supply_total"].(string)

				if items["supply_type"] == nil || reflect.TypeOf(items["supply_type"]).String() != "string" {
					utils.ErrorLog("supply_type")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_type := items["supply_type"].(string)

				if items["supply_unit"] == nil || reflect.TypeOf(items["supply_unit"]).String() != "string" {
					utils.ErrorLog("supply_unit")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_unit := items["supply_unit"].(string)

				if items["type"] == nil || reflect.TypeOf(items["type"]).String() != "float64" {
					utils.ErrorLog("type")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				is_source := int64(items["type"].(float64))

				if items["supply_manufacturer"] == nil || reflect.TypeOf(items["supply_manufacturer"]).String() != "string" {
					utils.ErrorLog("supply_manufacturer")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_manufacturer := items["supply_manufacturer"].(string)
				order := models.SpSupplierWarehousingOutOrder{
					OrderNumber:             order_number,
					ProjectId:               project_id,
					IsSource:                is_source,
					Count:                   supply_count,
					Amount:                  supply_total_price_float,
					Price:                   price_float,
					Remark:                  supply_remake,
					IsCheck:                 2,
					UserOrgId:               orgId,
					Status:                  1,
					Ctime:                   time.Now().Unix(),
					Mtime:                   0,
					WarehouseOutId:          warehouseOut.ID,
					Type:                    1,
					SupplyBatchNumber:       supply_batch_number,
					SupplyProductDate:       supply_product_date_time,
					SupplyExpiryDate:        supply_expiry_date_time,
					WarehousingId:           warehousing_id,
					WarehouseInfoId:         id,
					SupplyType:              supply_type,
					SupplyUnit:              supply_unit,
					SupplyTotal:             supply_total,
					SupplySpecificationName: supply_specification_name,
					SupplyLicenseNumber:     supply_license_number,
					Name:                    name,
					ManufacturerId:          manufacturer_id,
					GoodNumber:              warehouseOut.GoodNumber,
					SupplyManufacturer:      supply_manufacturer,
					MinPrice:                min_price_float,
					IsWarehosue:             2,
				}
				warehousingOut = append(warehousingOut, &order)
			}
		}
	}

	for _, item := range warehousingOut {
		//如果是手动新增的，type 等于2
		if item.WarehouseInfoId == 0 {
			item.Type = 2
			service.CreateSupplyWarehousOutOrder(item)
		}

		if item.WarehouseInfoId > 0 {
			//查询该商品是否来源于采购订单,如果存在则关联， 如果不存在则取消关联
			_, errcode := service.GetGoodIsSource(warehousing_id, item.ProjectId, orgId)

			if errcode == gorm.ErrRecordNotFound {
				item.WarehousingId = 0
				item.WarehouseInfoId = 0
				item.OrderNumber = ""
				item.Type = 2
				err = service.CreateSupplyWarehousOutOrder(item)
				//更新采购单
				service.ModfySupplyWarehouseOut(warehousing_id, orgId)
			}
			if errcode == nil {
				err = service.CreateSupplyWarehousOutOrder(item)
			}
		}

	}

	list, parseDateErr := service.GetSupplyWarehouseOutById(warehouseOut.ID, orgId)

	if parseDateErr == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"list":         list,
			"warehouseOut": warehouseOut,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) GetAllGoodOderList() {

	check_id, _ := this.GetInt64("check_id")
	start_time := this.GetString("start_time")
	end_time := this.GetString("end_time")
	keyword := this.GetString("keyword")
	page, _ := this.GetInt64("page")
	limit, _ := this.GetInt64("limit")
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	var startTime int64
	if len(start_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		if err != nil {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		startTime = theTime.Unix()
	}
	var endTime int64
	if len(end_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 00:00:00", loc)
		if err != nil {
			utils.ErrorLog(err.Error())
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		endTime = theTime.Unix()

	}
	orgId := this.GetAdminUserInfo().CurrentOrgId

	list, total, err := service.GetAllGoodOderList(check_id, keyword, page, limit, startTime, endTime, orgId)
	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"list":  list,
			"total": total,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) GetGoodOrderDetail() {

	id, _ := this.GetInt64("id")
	ids := this.GetString("ids")
	orgId := this.GetAdminUserInfo().CurrentOrgId

	if len(ids) == 0 {
		out, err := service.GetGoodOrderDetail(id, orgId)
		list, _ := service.GetSupplyWarehouseOutById(id, orgId)
		for _, item := range list {

			if item.IsSource == 1 {
				waresingList, _ := service.GetAllDrugWaresingList(item.ProjectId, orgId)
				medical, _ := service.GetBaseDrugMedical(item.ProjectId)
				item.DrugWarehouseInfo = waresingList
				item.SpBaseDrug = medical
			}
			if item.IsSource == 2 {
				waresingList, _ := service.GetAllGoodWaresingList(item.ProjectId, orgId)

				item.GoodWarehouseInfo = waresingList
			}
		}
		drugList, _ := service.GetSupplyDrugList(orgId)
		goodList, _ := service.GetSupplyGoodList(orgId)
		supplyList, _ := service.GetSupplierList(orgId)
		if err == nil {
			this.ServeSuccessJSON(map[string]interface{}{
				"out":        out,
				"list":       list,
				"goodList":   goodList,
				"drugList":   drugList,
				"supplyList": supplyList,
			})
		} else {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
		}
	}
	if len(ids) > 0 {
		idArray := strings.Split(ids, ",")
		out, err := service.GetGoodOrderDetail(id, orgId)
		list, _ := service.GetSupplyWarehouseOutByIdOne(id, orgId, idArray)
		for _, item := range list {
			if item.IsSource == 1 {
				waresingList, _ := service.GetAllDrugWaresingList(item.ProjectId, orgId)
				medical, _ := service.GetBaseDrugMedical(item.ProjectId)
				item.DrugWarehouseInfo = waresingList
				item.SpBaseDrug = medical
			}
			if item.IsSource == 2 {
				waresingList, _ := service.GetAllGoodWaresingList(item.ProjectId, orgId)

				item.GoodWarehouseInfo = waresingList
			}
		}
		drugList, _ := service.GetSupplyDrugList(orgId)
		goodList, _ := service.GetSupplyGoodList(orgId)
		supplyList, _ := service.GetSupplierList(orgId)
		if err == nil {
			this.ServeSuccessJSON(map[string]interface{}{
				"out":        out,
				"list":       list,
				"goodList":   goodList,
				"drugList":   drugList,
				"supplyList": supplyList,
			})
		} else {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
		}
	}

}

func (this *SupplyOrderApiController) UpdateGoodOrder() {
	supplier_id, _ := this.GetInt64("supplier_id")
	start_time := this.GetString("start")
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	var startTime int64
	if len(start_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		if err != nil {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		startTime = theTime.Unix()
	}
	arrerage := this.GetString("arrerage")
	arrerage_float, _ := strconv.ParseFloat(arrerage, 64)
	payment := this.GetString("payment")
	payment_float, _ := strconv.ParseFloat(payment, 64)
	warehose_out_id, _ := this.GetInt64("warehose_out_id")
	number := this.GetString("number")
	rate_of_concession := this.GetString("rate_of_concession")
	rate_of_concession_float, _ := strconv.ParseFloat(rate_of_concession, 64)
	discount_amount := this.GetString("discount_amount")
	discount_amount_float, _ := strconv.ParseFloat(discount_amount, 64)
	good_number := this.GetString("good_number")
	fmt.Println(supplier_id, startTime, arrerage, payment, warehose_out_id, number, rate_of_concession, discount_amount)
	orgId := this.GetAdminUserInfo().CurrentOrgId
	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	var warehousingOut []*models.SpSupplierWarehousingOutOrder
	var updateWarehout []*models.SpSupplierWarehousingOutOrder
	return_remake := dataBody["return_remake"].(string)
	if dataBody["stockIn"] != nil && reflect.TypeOf(dataBody["stockIn"]).String() == "[]interface {}" {
		thisStockIn, _ := dataBody["stockIn"].([]interface{})
		if len(thisStockIn) > 0 {
			for _, item := range thisStockIn {
				items := item.(map[string]interface{})

				if items["id"] == nil || reflect.TypeOf(items["id"]).String() != "float64" {
					utils.ErrorLog("id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				id := int64(items["id"].(float64))

				if items["supply_count"] == nil || reflect.TypeOf(items["supply_count"]).String() != "float64" {
					utils.ErrorLog("supply_count")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_count := int64(items["supply_count"].(float64))

				if items["manufacturer_id"] == nil || reflect.TypeOf(items["manufacturer_id"]).String() != "float64" {
					utils.ErrorLog("manufacturer_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				manufacturer_id := int64(items["manufacturer_id"].(float64))

				if items["name"] == nil || reflect.TypeOf(items["name"]).String() != "string" {
					utils.ErrorLog("name")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				name := items["name"].(string)

				if items["order_number"] == nil || reflect.TypeOf(items["order_number"]).String() != "string" {
					utils.ErrorLog("order_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				order_number := items["order_number"].(string)

				if items["supply_price"] == nil || reflect.TypeOf(items["supply_price"]).String() != "string" {
					utils.ErrorLog("supply_price")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_price := items["supply_price"].(string)

				price_float, _ := strconv.ParseFloat(supply_price, 64)

				if items["supply_total_price"] == nil || reflect.TypeOf(items["supply_total_price"]).String() != "string" {
					utils.ErrorLog("supply_total_price")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_total_price := items["supply_total_price"].(string)

				supply_total_price_float, _ := strconv.ParseFloat(supply_total_price, 64)

				if items["min_price"] == nil || reflect.TypeOf(items["min_price"]).String() != "string" {
					utils.ErrorLog("min_price")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				min_price := items["min_price"].(string)

				min_price_float, _ := strconv.ParseFloat(min_price, 64)

				if items["project_id"] == nil || reflect.TypeOf(items["project_id"]).String() != "float64" {
					utils.ErrorLog("project_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				project_id := int64(items["project_id"].(float64))

				if items["supply_remake"] == nil || reflect.TypeOf(items["supply_remake"]).String() != "string" {
					utils.ErrorLog("supply_remake")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_remake := items["supply_remake"].(string)

				if items["supply_batch_number"] == nil || reflect.TypeOf(items["supply_batch_number"]).String() != "string" {
					utils.ErrorLog("supply_batch_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_batch_number := items["supply_batch_number"].(string)

				var supply_expiry_date_time int64
				if items["supply_expiry_date"] == nil || reflect.TypeOf(items["supply_expiry_date"]).String() != "string" {
					utils.ErrorLog("supply_expiry_date")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_expiry_date := items["supply_expiry_date"].(string)

				if len(supply_expiry_date) > 0 {
					theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", supply_expiry_date+" 00:00:00", loc)
					if err != nil {
						this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
						return
					}
					supply_expiry_date_time = theTime.Unix()
				}

				if items["supply_license_number"] == nil || reflect.TypeOf(items["supply_license_number"]).String() != "string" {
					utils.ErrorLog("supply_license_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_license_number := items["supply_license_number"].(string)

				var supply_product_date_time int64
				if items["supply_product_date"] == nil || reflect.TypeOf(items["supply_product_date"]).String() != "string" {
					utils.ErrorLog("supply_product_date")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_product_date := items["supply_product_date"].(string)

				if len(supply_product_date) > 0 {
					theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", supply_product_date+" 00:00:00", loc)
					if err != nil {
						this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
						return
					}
					supply_product_date_time = theTime.Unix()
				}

				if items["supply_specification_name"] == nil || reflect.TypeOf(items["supply_specification_name"]).String() != "string" {
					utils.ErrorLog("supply_specification_name")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_specification_name := items["supply_specification_name"].(string)

				if items["supply_total"] == nil || reflect.TypeOf(items["supply_total"]).String() != "string" {
					utils.ErrorLog("supply_total")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_total := items["supply_total"].(string)

				if items["supply_type"] == nil || reflect.TypeOf(items["supply_type"]).String() != "string" {
					utils.ErrorLog("supply_type")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_type := items["supply_type"].(string)

				if items["supply_unit"] == nil || reflect.TypeOf(items["supply_unit"]).String() != "string" {
					utils.ErrorLog("supply_unit")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_unit := items["supply_unit"].(string)

				if items["type"] == nil || reflect.TypeOf(items["type"]).String() != "float64" {
					utils.ErrorLog("type")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				is_source := int64(items["type"].(float64))

				if items["supply_manufacturer"] == nil || reflect.TypeOf(items["supply_manufacturer"]).String() != "string" {
					utils.ErrorLog("supply_manufacturer")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_manufacturer := items["supply_manufacturer"].(string)

				if items["warehouse_info_id"] == nil || reflect.TypeOf(items["warehouse_info_id"]).String() != "float64" {
					utils.ErrorLog("warehouse_info_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				warehouse_info_id := int64(items["warehouse_info_id"].(float64))

				if items["warehousing_id"] == nil || reflect.TypeOf(items["warehousing_id"]).String() != "float64" {
					utils.ErrorLog("warehousing_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				warehousing_id := int64(items["warehousing_id"].(float64))
				if id > 0 {
					order := models.SpSupplierWarehousingOutOrder{
						ID:                      id,
						OrderNumber:             order_number,
						ProjectId:               project_id,
						IsSource:                is_source,
						Count:                   supply_count,
						Amount:                  supply_total_price_float,
						Price:                   price_float,
						Remark:                  supply_remake,
						IsCheck:                 2,
						UserOrgId:               orgId,
						Status:                  1,
						Ctime:                   time.Now().Unix(),
						Mtime:                   0,
						WarehouseOutId:          warehose_out_id,
						Type:                    1,
						SupplyBatchNumber:       supply_batch_number,
						SupplyProductDate:       supply_product_date_time,
						SupplyExpiryDate:        supply_expiry_date_time,
						SupplyType:              supply_type,
						SupplyUnit:              supply_unit,
						SupplyTotal:             supply_total,
						SupplySpecificationName: supply_specification_name,
						SupplyLicenseNumber:     supply_license_number,
						Name:                    name,
						ManufacturerId:          manufacturer_id,
						GoodNumber:              good_number,
						SupplyManufacturer:      supply_manufacturer,
						WarehouseInfoId:         warehouse_info_id,
						WarehousingId:           warehousing_id,
						MinPrice:                min_price_float,
					}
					updateWarehout = append(updateWarehout, &order)
				}

				if id == 0 {
					order := models.SpSupplierWarehousingOutOrder{
						OrderNumber:             order_number,
						ProjectId:               project_id,
						IsSource:                is_source,
						Count:                   supply_count,
						Amount:                  supply_total_price_float,
						Price:                   price_float,
						Remark:                  supply_remake,
						IsCheck:                 2,
						UserOrgId:               orgId,
						Status:                  1,
						Ctime:                   time.Now().Unix(),
						Mtime:                   0,
						WarehouseOutId:          warehose_out_id,
						Type:                    1,
						SupplyBatchNumber:       supply_batch_number,
						SupplyProductDate:       supply_product_date_time,
						SupplyExpiryDate:        supply_expiry_date_time,
						WarehouseInfoId:         id,
						SupplyType:              supply_type,
						SupplyUnit:              supply_unit,
						SupplyTotal:             supply_total,
						SupplySpecificationName: supply_specification_name,
						SupplyLicenseNumber:     supply_license_number,
						Name:                    name,
						ManufacturerId:          manufacturer_id,
						GoodNumber:              good_number,
						SupplyManufacturer:      supply_manufacturer,
						MinPrice:                min_price_float,
						IsWarehosue:             2,
					}
					warehousingOut = append(warehousingOut, &order)
				}

			}
		}
	}
	out := models.SpSupplierWarehouseOut{
		Arrearage:        arrerage_float,
		Payment:          payment_float,
		RateOfConcession: rate_of_concession_float,
		DiscountAmount:   discount_amount_float,
		SupplierId:       supplier_id,
		DocumentDate:     startTime,
		ReturnRemake:     return_remake,
	}

	//更改购货单据
	service.UpdateGoodWarehouseOut(warehose_out_id, out)

	for _, item := range warehousingOut {
		//如果是手动新增的，type 等于2
		if item.WarehouseInfoId == 0 {
			item.Type = 2
		}
		err = service.CreateSupplyWarehousOutOrder(item)
	}

	for _, item := range updateWarehout {
		service.UpdateGoodWarehouseOutOrder(item)
	}
	//for _, item := range updateWarehout {
	//	service.UpdateGoodWarehouseOutOrder(item)
	//	//查询该商品是否来源于采购订单,如果存在则关联， 如果不存在则取消关联
	//	_, errcode := service.GetGoodIsSource(item.WarehousingId, item.ProjectId, orgId)
	//	if errcode == gorm.ErrRecordNotFound {
	//		item.WarehousingId = 0
	//		item.WarehouseInfoId = 0
	//		item.Type = 2
	//		item.OrderNumber = ""
	//
	//		//更新采购单
	//		service.ModfySupplyWarehouseOut(item.WarehousingId, orgId)
	//	}
	//}
	list, _ := service.GetSupplyWarehouseOutById(warehose_out_id, orgId)
	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"out":  out,
			"list": list,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) DeletePurchOrder() {

	id, _ := this.GetInt64("id")
	orgId := this.GetAdminUserInfo().CurrentOrgId
	err := service.DeletePurchOrder(id, orgId)
	if err == nil {
		returnData := make(map[string]interface{}, 0)
		returnData["msg"] = "ok"
		this.ServeSuccessJSON(returnData)
		return
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}

}

func (this *SupplyOrderApiController) GetAllOrderCountList() {

	id, _ := this.GetInt64("id")
	orgId := this.GetAdminUserInfo().CurrentOrgId
	//获取购货订单的数据
	purcaseOrder, _ := service.GetAllPurcaseOrderById(id, orgId)
	//获取购货单的数据
	goodOrder, err := service.GetAllGoodOrderByIdSix(id, orgId)

	drugList, err := service.GetSupplyDrugList(orgId)

	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"purcaseOrder": purcaseOrder,
			"goodOrder":    goodOrder,
			"drugList":     drugList,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) GetPurchOrderInfo() {
	id, _ := this.GetInt64("id")
	ids := this.GetString("ids")
	if len(ids) == 0 {
		info, _ := service.GetPurchaseOrderDetail(id)
		//查询
		orderInfo, err := service.GetSupplyWarehousingOrderInfo(id)
		orgId := this.GetAdminUserInfo().CurrentOrgId
		supplyList, _ := service.GetSupplierList(orgId)
		//获取药品库数据
		baseList, _ := service.GetSupplyDrugList(orgId)

		goodList, _ := service.GetSupplyGoodList(orgId)
		if err == nil {
			this.ServeSuccessJSON(map[string]interface{}{
				"info":       info,
				"orderInfo":  orderInfo,
				"supplyList": supplyList,
				"baseList":   baseList,
				"goodList":   goodList,
			})
		} else {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
		}
	}
	if len(ids) > 0 {
		idArray := strings.Split(ids, ",")
		info, _ := service.GetPurchaseOrderDetail(id)
		//查询
		orderInfo, err := service.GetSupplyWarehousingOrderInfoTwo(id, idArray)
		orgId := this.GetAdminUserInfo().CurrentOrgId
		supplyList, _ := service.GetSupplierList(orgId)
		//获取药品库数据
		baseList, _ := service.GetSupplyDrugList(orgId)

		goodList, _ := service.GetSupplyGoodList(orgId)
		if err == nil {
			this.ServeSuccessJSON(map[string]interface{}{
				"info":       info,
				"orderInfo":  orderInfo,
				"supplyList": supplyList,
				"baseList":   baseList,
				"goodList":   goodList,
			})
		} else {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
		}
	}
}

func (this *SupplyOrderApiController) GetGoodOrderList() {

	id, _ := this.GetInt64("id")
	orgId := this.GetAdminUserInfo().CurrentOrgId
	list, err := service.GetGoodOrderList(id, orgId)
	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"list": list,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) GetReturnOrder() {

	id, _ := this.GetInt64("id")
	orgId := this.GetAdminUserInfo().CurrentOrgId
	err := service.GetReturnOrder(id, orgId)
	if err == nil {
		returnData := make(map[string]interface{}, 0)
		returnData["msg"] = "ok"
		this.ServeSuccessJSON(returnData)
		return
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) GetGoodOrderCountList() {
	id, _ := this.GetInt64("id")
	warehousing_id, _ := this.GetInt64("warehousing_id")
	orgId := this.GetAdminUserInfo().CurrentOrgId
	checker := this.GetAdminUserInfo().AdminUser.Id
	recordDateStr := time.Now().Format("2006-01-02")
	recordDate, _ := utils.ParseTimeStringToTime("2006-01-02", recordDateStr)
	record_date := recordDate.Unix()
	out := models.SpSupplierWarehouseOut{
		IsCheck:   1,
		Checker:   checker,
		CheckTime: record_date,
	}
	err := service.CheckGoodOrder(id, orgId, out)
	fmt.Println(err)
	//获取购货订单的数据
	purcaseOrder, _ := service.GetAllPurcaseOrderById(warehousing_id, orgId)
	//获取购货单的数据
	goodOrder, _ := service.GetAllGoodOrderByIdTwo(id, orgId)

	houseConfig, _ := service.GetAllStoreHouseConfig(orgId)
	//查询该购货单是否审核成功
	detail, _ := service.GetGoodOrderDetail(id, orgId)
	var warehousingInfo []*models.WarehousingInfo
	var warehouseInfoDetail []*models.DrugWarehouseInfo
	var drugFlow []*models.DrugFlow
	//如果审核成功
	if detail.IsCheck == 1 {
		//入库
		if len(goodOrder) > 0 {
			for _, item := range goodOrder {
				//药品
				if item.IsSource == 1 {
					//获取药品类型
					medical, _ := service.GetBaseDrugMedical(item.ID)
					timeStr := time.Now().Format("2006-01-02")
					timeArr := strings.Split(timeStr, "-")
					total, _ := service.FindAllWarehouseTotalOne(orgId)
					total = total + 1

					warehousing_order := "YPRKD" + strconv.FormatInt(orgId, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000" + strconv.FormatInt(total, 10)

					operation_time := time.Now().Unix()
					warehousing := models.DrugWarehouse{
						WarehousingOrder:  warehousing_order,
						OperationTime:     operation_time,
						OrgId:             orgId,
						Creater:           checker,
						Ctime:             time.Now().Unix(),
						Status:            1,
						WarehousingTime:   record_date,
						Type:              1,
						SupplyWarehouseId: id,
						StorehouseId:      houseConfig.DrugStorehouseInfo,
						IsCheck:           1,
					}
					//查询今日是否存在入库单号
					//_, errcode := service.GetSingleDrugWarehouseOrder(record_date, orgId)
					//if errcode == gorm.ErrRecordNotFound {
					service.AddSigleDrugWarehouse(&warehousing)
					//}
					drugWarehouseInfo, _ := service.GetLastDrugWarehouse(orgId)

					warehouseInfoDetailOne := &models.DrugWarehouseInfo{
						WarehousingOrder:          drugWarehouseInfo.WarehousingOrder,
						WarehousingId:             drugWarehouseInfo.ID,
						DrugId:                    item.ProjectId,
						Number:                    item.SupplyLicenseNumber,
						ProductDate:               item.SupplyProductDate,
						ExpiryDate:                item.SupplyExpiryDate,
						WarehousingCount:          item.Count,
						Price:                     item.Price,
						TotalPrice:                0,
						Status:                    1,
						Ctime:                     time.Now().Unix(),
						Remark:                    item.Remark,
						OrgId:                     orgId,
						Type:                      1,
						Manufacturer:              item.ManufacturerId,
						Dealer:                    0,
						StockMaxNumber:            item.Count,
						RetailTotalPrice:          0,
						BatchNumber:               item.SupplyBatchNumber,
						MaxUnit:                   item.SupplyUnit,
						MinUnit:                   item.SupplyUnit,
						RetailPrice:               item.MinPrice,
						SupplyWarehouseId:         id,
						SupplyWarehouseDetailInfo: item.ID,
						StorehouseId:              houseConfig.DrugStorehouseInfo,
						IsCheck:                   1,
					}
					if medical.MaxUnit == medical.MinUnit {
						warehouseInfoDetailOne.StockMaxNumber = item.Count
						warehouseInfoDetailOne.StockMinNumber = 0
						warehouseInfoDetailOne.MaxUnit = item.SupplyUnit
					}
					if item.SupplyUnit == medical.MinUnit && medical.MaxUnit != medical.MinUnit {
						warehouseInfoDetailOne.StockMaxNumber = 0
						warehouseInfoDetailOne.StockMinNumber = item.Count
						warehouseInfoDetailOne.MaxUnit = item.SupplyUnit
					}
					warehouseInfoDetail = append(warehouseInfoDetail, warehouseInfoDetailOne)

					drugflow := &models.DrugFlow{
						WarehousingOrder:          drugWarehouseInfo.WarehousingOrder,
						WarehousingId:             drugWarehouseInfo.ID,
						DrugId:                    item.ProjectId,
						Number:                    item.SupplyBatchNumber,
						ProductDate:               item.SupplyProductDate,
						ExpireDate:                item.SupplyExpiryDate,
						Count:                     item.Count,
						Price:                     item.Price,
						Status:                    1,
						Ctime:                     time.Now().Unix(),
						UserOrgId:                 orgId,
						Manufacturer:              item.ManufacturerId,
						Dealer:                    0,
						BatchNumber:               item.SupplyBatchNumber,
						MaxUnit:                   item.SupplyUnit,
						MinUnit:                   item.SupplyUnit,
						ConsumableType:            1,
						IsEdit:                    1,
						Creator:                   checker,
						IsSys:                     0,
						SupplyWarehouseId:         id,
						SupplyWarehouseDetailInfo: item.ID,
						StorehouseId:              houseConfig.DrugStorehouseInfo,
					}

					if medical.MaxUnit == medical.MinUnit {
						drugflow.MaxUnit = item.SupplyUnit

					}
					if item.SupplyUnit == medical.MinUnit {
						warehouseInfoDetailOne.MaxUnit = warehouseInfoDetailOne.MinUnit
					}
					drugFlow = append(drugFlow, drugflow)
				}
				//耗材
				if item.IsSource == 2 {
					//获取耗材类型
					good, _ := service.GetGoodInformationByGoodId(item.ProjectId)
					timeStr := time.Now().Format("2006-01-02")
					timeArr := strings.Split(timeStr, "-")
					total, _ := service.FindAllWarehouseTotal(orgId)
					total = total + 1
					warehousing_order := "RKD" + strconv.FormatInt(orgId, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000" + strconv.FormatInt(total, 10)
					operation_time := time.Now().Unix()
					creater := this.GetAdminUserInfo().AdminUser.Id
					warehousing := models.Warehousing{
						WarehousingOrder:  warehousing_order,
						OperationTime:     operation_time,
						OrgId:             orgId,
						Creater:           creater,
						Ctime:             time.Now().Unix(),
						Status:            1,
						WarehousingTime:   record_date,
						Type:              1,
						SupplyWarehouseId: id,
						StorehouseId:      houseConfig.StorehouseInfo,
						IsCheck:           1,
					}
					//查询是否存在入库单
					//_, errcose := service.GetSindleWarehouse(record_date, orgId)
					//if errcose == gorm.ErrRecordNotFound {
					service.AddSigleWarehouse(&warehousing)
					//}
					info, _ := service.GetLastWarehouseInfoByInfo(orgId)

					//入库单表格
					warehouseInfo := &models.WarehousingInfo{
						WarehousingOrder:          info.WarehousingOrder,
						WarehousingId:             info.ID,
						GoodId:                    item.ProjectId,
						Number:                    item.SupplyBatchNumber,
						GoodTypeId:                good.GoodTypeId,
						ProductDate:               item.SupplyProductDate,
						ExpiryDate:                item.SupplyExpiryDate,
						WarehousingCount:          item.Count,
						Price:                     item.Price,
						TotalPrice:                0,
						Status:                    1,
						Ctime:                     time.Now().Unix(),
						Remark:                    item.Remark,
						OrgId:                     orgId,
						Type:                      1,
						Manufacturer:              item.ManufacturerId,
						StockCount:                item.Count,
						Dealer:                    good.Dealer,
						LicenseNumber:             item.SupplyLicenseNumber,
						PackingPrice:              item.MinPrice,
						SupplyWarehouseId:         id,
						SupplyWarehouseDetailInfo: item.ID,
						StorehouseId:              houseConfig.StorehouseInfo,
						IsCheck:                   1,
					}
					warehousingInfo = append(warehousingInfo, warehouseInfo)
				}
			}
		}
	}

	for _, item := range warehousingInfo {
		service.CreatedWarehouseingDetail(item)
		//查询该机构默认仓库
		storeConfig, _ := service.GetAllStoreHouseConfig(item.OrgId)
		//查询剩余库存
		goodList, _ := service.GetGoodSumCountByStoreId(storeConfig.StorehouseOutInfo, item.GoodId, item.OrgId)
		var sum_count int64
		var sum_in_count int64
		for _, item := range goodList {
			sum_count += item.StockCount
			sum_in_count += item.WarehousingCount
		}
		service.UpdateGoodByGoodId(item.GoodId, sum_count, sum_in_count, item.OrgId)

		warehousinginfo, _ := service.GetLastWarehousingInfo(item.GoodId)
		flow := models.VmStockFlow{
			WarehousingOrder:          item.WarehousingOrder,
			WarehousingId:             item.ID,
			GoodId:                    item.GoodId,
			Number:                    item.Number,
			ProductDate:               item.ProductDate,
			ExpireDate:                item.ExpiryDate,
			Count:                     item.WarehousingCount,
			Price:                     item.Price,
			Status:                    1,
			Ctime:                     time.Now().Unix(),
			UserOrgId:                 orgId,
			Manufacturer:              item.Manufacturer,
			Dealer:                    item.Dealer,
			LicenseNumber:             item.LicenseNumber,
			IsEdit:                    1,
			Creator:                   checker,
			SystemTime:                record_date,
			ConsumableType:            1,
			WarehousingDetailId:       warehousinginfo.ID,
			SupplyWarehouseId:         id,
			SupplyWarehouseDetailInfo: item.ID,
			StorehouseId:              houseConfig.StorehouseInfo,
		}
		service.CreateStockFlowOne(flow)
	}
	//创建入库单
	errs := service.CreateDrugWarehousingInfoSix(warehouseInfoDetail)

	//改变入库状态
	for _, items := range warehouseInfoDetail {

		//查询默认仓库
		houseConfig, _ := service.GetAllStoreHouseConfig(items.OrgId)
		//查询默认仓库剩余多少库存
		list, _ := service.GetDrugSumCountByStorehouseId(houseConfig.DrugStorehouseOut, items.OrgId, items.DrugId)
		var sum_count int64
		var sum_in_count int64
		for _, it := range list {
			baseDrug, _ := service.GetBaseDrugMedical(it.DrugId)
			if it.MaxUnit == baseDrug.MaxUnit {
				it.StockMaxNumber = it.StockMaxNumber * baseDrug.MinNumber
				it.WarehousingCount = it.WarehousingCount * baseDrug.MinNumber
			}
			sum_count += it.StockMaxNumber + it.StockMinNumber
			sum_in_count += it.WarehousingCount
		}
		service.UpdateMedicalSumCount(items.DrugId, sum_count, sum_in_count, items.OrgId)

	}
	fmt.Println(errs)
	for _, items := range drugFlow {
		drugWarehouseInfo, _ := service.GetLastDrugWarehouseInfo(items.DrugId)
		items.WarehousingDetailId = drugWarehouseInfo.ID
	}
	//创建流水单
	service.CreateDrugFlowSix(drugFlow)

	drugList, _ := service.GetSupplyDrugList(orgId)

	for _, items := range goodOrder {
		service.UpdateWarehouseingById(items.ID)
	}
	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"purcaseOrder": purcaseOrder,
			"goodOrder":    goodOrder,
			"drugList":     drugList,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) ModefySupplyWarehousing() {

	is_warehouse, _ := this.GetInt64("is_warehouse")
	warehousing_id, _ := this.GetInt64("warehousing_id")
	orgId := this.GetAdminUserInfo().CurrentOrgId
	err := service.ModefySupplyWarehousing(is_warehouse, warehousing_id, orgId)
	if err == nil {
		returnData := make(map[string]interface{}, 0)
		returnData["msg"] = "ok"
		this.ServeSuccessJSON(returnData)
		return
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) SaveGoodReturnOrder() {
	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	return_remark := dataBody["return_marke"].(string)

	supplier_id, _ := this.GetInt64("supplier_id")
	start_time := this.GetString("start_time")
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	var startTime int64
	if len(start_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		if err != nil {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		startTime = theTime.Unix()
	}
	warehouse_out_id, _ := this.GetInt64("warehouse_out_id")
	arrerage := this.GetString("arrerage")
	arrerage_float, _ := strconv.ParseFloat(arrerage, 64)
	payment := this.GetString("payment")
	payment_float, _ := strconv.ParseFloat(payment, 64)
	rate_of_concession := this.GetString("rate_of_concession")
	rate_of_concession_float, _ := strconv.ParseFloat(rate_of_concession, 64)
	discount_amount := this.GetString("discount_amount")
	discount_amount_float, _ := strconv.ParseFloat(discount_amount, 64)

	orgId := this.GetAdminUserInfo().CurrentOrgId
	total, _ := service.GetSupplyCancelOrder(orgId)
	creater := this.GetAdminUserInfo().AdminUser.Id
	//生成购货单
	timeStr := time.Now().Format("2006-01-02")
	timeArr := strings.Split(timeStr, "-")
	total = total + 1
	warehousing_order := "CGT" + timeArr[0] + timeArr[1] + timeArr[2] + "00" + strconv.FormatInt(total, 10)
	recordDateStr := time.Now().Format("2006-01-02")
	recordDate, _ := utils.ParseTimeStringToTime("2006-01-02", recordDateStr)
	cancel := models.SpSupplierWarehouseCancel{
		Number:           warehousing_order,
		UserOrgId:        orgId,
		Creater:          creater,
		Ctime:            time.Now().Unix(),
		Mtime:            0,
		Status:           1,
		RecordDate:       recordDate.Unix(),
		IsCheck:          2,
		WarehouseOutId:   warehouse_out_id,
		RateOfConcession: rate_of_concession_float,
		DiscountAmount:   discount_amount_float,
		DocumentDate:     startTime,
		SupplierId:       supplier_id,
		Checker:          0,
		CheckTime:        0,
		Arrearage:        arrerage_float,
		Payment:          payment_float,
		ReturnRemark:     return_remark,
	}
	err = service.CreateReturnCacelOrder(cancel)
	order, _ := service.GetLastReturnCancelOrder(orgId)

	var warehouseCancel []*models.SpSupplierWarehousingCancelOrder
	if dataBody["stockIn"] != nil && reflect.TypeOf(dataBody["stockIn"]).String() == "[]interface {}" {
		thisStockIn, _ := dataBody["stockIn"].([]interface{})
		if len(thisStockIn) > 0 {
			for _, item := range thisStockIn {
				items := item.(map[string]interface{})

				if items["supply_count"] == nil || reflect.TypeOf(items["supply_count"]).String() != "float64" {
					utils.ErrorLog("supply_count")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_count := int64(items["supply_count"].(float64))

				if items["count"] == nil || reflect.TypeOf(items["count"]).String() != "string" {
					utils.ErrorLog("count")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				count := items["count"].(string)

				if items["manufacturer_id"] == nil || reflect.TypeOf(items["manufacturer_id"]).String() != "float64" {
					utils.ErrorLog("manufacturer_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				manufacturer_id := int64(items["manufacturer_id"].(float64))

				if items["name"] == nil || reflect.TypeOf(items["name"]).String() != "string" {
					utils.ErrorLog("name")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				name := items["name"].(string)

				if items["order_number"] == nil || reflect.TypeOf(items["order_number"]).String() != "string" {
					utils.ErrorLog("order_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				order_number := items["order_number"].(string)

				if items["good_number"] == nil || reflect.TypeOf(items["good_number"]).String() != "string" {
					utils.ErrorLog("good_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				good_number := items["good_number"].(string)

				if items["supply_price"] == nil || reflect.TypeOf(items["supply_price"]).String() != "string" {
					utils.ErrorLog("supply_price")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_price := items["supply_price"].(string)

				price_float, _ := strconv.ParseFloat(supply_price, 64)

				if items["project_id"] == nil || reflect.TypeOf(items["project_id"]).String() != "float64" {
					utils.ErrorLog("project_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				project_id := int64(items["project_id"].(float64))

				if items["supply_remake"] == nil || reflect.TypeOf(items["supply_remake"]).String() != "string" {
					utils.ErrorLog("supply_remake")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_remake := items["supply_remake"].(string)

				if items["supply_license_number"] == nil || reflect.TypeOf(items["supply_license_number"]).String() != "string" {
					utils.ErrorLog("supply_license_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_license_number := items["supply_license_number"].(string)

				if items["supply_specification_name"] == nil || reflect.TypeOf(items["supply_specification_name"]).String() != "string" {
					utils.ErrorLog("supply_specification_name")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_specification_name := items["supply_specification_name"].(string)

				if items["supply_total"] == nil || reflect.TypeOf(items["supply_total"]).String() != "string" {
					utils.ErrorLog("supply_total")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_total := items["supply_total"].(string)

				if items["supply_type"] == nil || reflect.TypeOf(items["supply_type"]).String() != "string" {
					utils.ErrorLog("supply_type")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_type := items["supply_type"].(string)

				if items["supply_unit"] == nil || reflect.TypeOf(items["supply_unit"]).String() != "string" {
					utils.ErrorLog("supply_unit")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_unit := items["supply_unit"].(string)

				if items["type"] == nil || reflect.TypeOf(items["type"]).String() != "float64" {
					utils.ErrorLog("type")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				is_source := int64(items["type"].(float64))

				if items["supply_manufacturer"] == nil || reflect.TypeOf(items["supply_manufacturer"]).String() != "string" {
					utils.ErrorLog("supply_manufacturer")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_manufacturer := items["supply_manufacturer"].(string)

				if items["supply_batch_number"] == nil || reflect.TypeOf(items["supply_batch_number"]).String() != "string" {
					utils.ErrorLog("supply_batch_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_batch_number := items["supply_batch_number"].(string)

				if items["supply_product_date"] == nil || reflect.TypeOf(items["supply_product_date"]).String() != "float64" {
					utils.ErrorLog("supply_product_date")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_product_date := int64(items["supply_product_date"].(float64))

				if items["supply_expiry_date"] == nil || reflect.TypeOf(items["supply_expiry_date"]).String() != "float64" {
					utils.ErrorLog("supply_expiry_date")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_expiry_date := int64(items["supply_expiry_date"].(float64))

				if items["warehousing_id"] == nil || reflect.TypeOf(items["warehousing_id"]).String() != "float64" {
					utils.ErrorLog("warehousing_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				warehousing_id := int64(items["warehousing_id"].(float64))

				if items["warehouse_info_id"] == nil || reflect.TypeOf(items["warehouse_info_id"]).String() != "float64" {
					utils.ErrorLog("warehouse_info_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				warehouse_info_id := int64(items["warehouse_info_id"].(float64))

				if items["id"] == nil || reflect.TypeOf(items["id"]).String() != "float64" {
					utils.ErrorLog("id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				id := int64(items["id"].(float64))

				deposit_rate := items["deposit_rate"].(string)

				deposit_rate_float, _ := strconv.ParseFloat(deposit_rate, 64)
				cancelOrder := &models.SpSupplierWarehousingCancelOrder{
					ManufacturerId:            manufacturer_id,
					OrderNumber:               order_number,
					ProjectId:                 project_id,
					GoodNumber:                good_number,
					IsSource:                  is_source,
					Count:                     count,
					Price:                     price_float,
					Remark:                    supply_remake,
					RateOfConcession:          rate_of_concession_float,
					DiscountAmount:            discount_amount_float,
					UserOrgId:                 orgId,
					Ctime:                     time.Now().Unix(),
					Status:                    1,
					Mtime:                     0,
					WarehouseCancelId:         order.ID,
					Type:                      1,
					ReturnNumber:              order.Number,
					WarehouseOutId:            warehouse_out_id,
					SupplySpecificationName:   supply_specification_name,
					SupplyType:                supply_type,
					SupplyTotal:               supply_total,
					SupplyManufacturer:        supply_manufacturer,
					Name:                      name,
					SupplyUnit:                supply_unit,
					SupplyLicenseNumber:       supply_license_number,
					SupplyBatchNumber:         supply_batch_number,
					SupplyExpiryDate:          supply_expiry_date,
					SupplyProductDate:         supply_product_date,
					WarehouseInfoId:           warehouse_info_id,
					WarehousingId:             warehousing_id,
					SourceCount:               count,
					SupplyWarehouseDetailInfo: id,
					SupplyCount:               supply_count,
					DepositRate:               deposit_rate_float,
				}
				warehouseCancel = append(warehouseCancel, cancelOrder)
			}
		}
	}

	for _, item := range warehouseCancel {
		if item.SupplyWarehouseDetailInfo > 0 {
			item.Type = 1
		} else {
			item.Type = 2
		}
		service.CreateCancelReturnOrder(item)
		//查询该商品在退库单中是否存在
		_, errcodes := service.GetSupplyWarehouseOutIsExsit(item.WarehouseOutId, item.ProjectId, orgId)
		//如果不存在则情况退库单的关联信息
		if errcodes == gorm.ErrRecordNotFound {
			service.ModfySupplyCancel(item.WarehouseCancelId, orgId, item.ProjectId)

		}

	}

	cancelOrder, err := service.GetReturnCancelOrder(order.ID, orgId)

	list, err := service.GetReturnCancelOrderList(order.ID, orgId)
	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"warehouseCancel": warehouseCancel,
			"cancelOrder":     cancelOrder,
			"list":            list,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) GetAllGoodReturnOrderList() {
	check_id, _ := this.GetInt64("check_id")
	start_time := this.GetString("start_time")
	end_time := this.GetString("end_time")
	keyword := this.GetString("keyword")
	page, _ := this.GetInt64("page")
	limit, _ := this.GetInt64("limit")
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	var startTime int64
	if len(start_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		if err != nil {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		startTime = theTime.Unix()
	}
	var endTime int64
	if len(end_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 00:00:00", loc)
		if err != nil {
			utils.ErrorLog(err.Error())
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		endTime = theTime.Unix()

	}
	orgId := this.GetAdminUserInfo().CurrentOrgId
	list, total, err := service.GetAllGoodReturnOrderList(check_id, keyword, page, limit, startTime, endTime, orgId)
	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"total": total,
			"list":  list,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) GetGoodReturnDetail() {

	id, _ := this.GetInt64("id")
	orgId := this.GetAdminUserInfo().CurrentOrgId
	detail, err := service.GetGoodReturnDetail(id, orgId)
	orderDetail, err := service.GetGoodReturnOrderDetail(id, orgId)
	//获取药品库数据
	baseList, _ := service.GetSupplyDrugList(orgId)

	goodList, _ := service.GetSupplyGoodList(orgId)
	supplyList, _ := service.GetSupplierList(orgId)
	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"cancelDetail":      detail,
			"orderCancelDetail": orderDetail,
			"drugList":          baseList,
			"goodList":          goodList,
			"supplyList":        supplyList,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) UpdateGoodReturn() {

	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	return_remark := dataBody["return_marke"].(string)

	supplier_id, _ := this.GetInt64("supplier_id")
	start_time := this.GetString("start")
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	var startTime int64
	if len(start_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		if err != nil {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		startTime = theTime.Unix()
	}
	warehouse_out_id, _ := this.GetInt64("warehouse_out_id")
	arrerage := this.GetString("arrerage")
	arrerage_float, _ := strconv.ParseFloat(arrerage, 64)
	payment := this.GetString("payment")
	payment_float, _ := strconv.ParseFloat(payment, 64)
	rate_of_concession := this.GetString("rate_of_concession")
	rate_of_concession_float, _ := strconv.ParseFloat(rate_of_concession, 64)
	discount_amount := this.GetString("discount_amount")
	discount_amount_float, _ := strconv.ParseFloat(discount_amount, 64)
	return_number := this.GetString("return_number")
	orgId := this.GetAdminUserInfo().CurrentOrgId

	cancel := models.SpSupplierWarehouseCancel{
		ID:               0,
		Number:           return_number,
		RateOfConcession: rate_of_concession_float,
		DiscountAmount:   discount_amount_float,
		DocumentDate:     startTime,
		SupplierId:       supplier_id,
		Arrearage:        arrerage_float,
		Payment:          payment_float,
		ReturnRemark:     return_remark,
	}

	service.UpdateWarehouseCancel(warehouse_out_id, cancel)

	var warehouseCancel []*models.SpSupplierWarehousingCancelOrder
	var updateWarehouseCancel []*models.SpSupplierWarehousingCancelOrder
	if dataBody["stockIn"] != nil && reflect.TypeOf(dataBody["stockIn"]).String() == "[]interface {}" {
		thisStockIn, _ := dataBody["stockIn"].([]interface{})

		if len(thisStockIn) > 0 {
			for _, item := range thisStockIn {
				items := item.(map[string]interface{})
				if items["id"] == nil || reflect.TypeOf(items["id"]).String() != "float64" {
					utils.ErrorLog("id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				id := int64(items["id"].(float64))
				if items["supply_count"] == nil || reflect.TypeOf(items["supply_count"]).String() != "float64" {
					utils.ErrorLog("supply_count")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_count := int64(items["supply_count"].(float64))

				if items["manufacturer_id"] == nil || reflect.TypeOf(items["manufacturer_id"]).String() != "float64" {
					utils.ErrorLog("manufacturer_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				manufacturer_id := int64(items["manufacturer_id"].(float64))

				if items["name"] == nil || reflect.TypeOf(items["name"]).String() != "string" {
					utils.ErrorLog("name")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				name := items["name"].(string)

				if items["order_number"] == nil || reflect.TypeOf(items["order_number"]).String() != "string" {
					utils.ErrorLog("order_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				order_number := items["order_number"].(string)

				if items["good_number"] == nil || reflect.TypeOf(items["good_number"]).String() != "string" {
					utils.ErrorLog("good_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				good_number := items["good_number"].(string)

				if items["supply_price"] == nil || reflect.TypeOf(items["supply_price"]).String() != "string" {
					utils.ErrorLog("supply_price")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_price := items["supply_price"].(string)

				price_float, _ := strconv.ParseFloat(supply_price, 64)

				if items["project_id"] == nil || reflect.TypeOf(items["project_id"]).String() != "float64" {
					utils.ErrorLog("project_id")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				project_id := int64(items["project_id"].(float64))

				if items["supply_remake"] == nil || reflect.TypeOf(items["supply_remake"]).String() != "string" {
					utils.ErrorLog("supply_remake")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_remake := items["supply_remake"].(string)

				if items["supply_license_number"] == nil || reflect.TypeOf(items["supply_license_number"]).String() != "string" {
					utils.ErrorLog("supply_license_number")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_license_number := items["supply_license_number"].(string)

				if items["supply_specification_name"] == nil || reflect.TypeOf(items["supply_specification_name"]).String() != "string" {
					utils.ErrorLog("supply_specification_name")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_specification_name := items["supply_specification_name"].(string)

				if items["supply_total"] == nil || reflect.TypeOf(items["supply_total"]).String() != "string" {
					utils.ErrorLog("supply_total")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_total := items["supply_total"].(string)

				if items["supply_type"] == nil || reflect.TypeOf(items["supply_type"]).String() != "string" {
					utils.ErrorLog("supply_type")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_type := items["supply_type"].(string)

				if items["supply_unit"] == nil || reflect.TypeOf(items["supply_unit"]).String() != "string" {
					utils.ErrorLog("supply_unit")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_unit := items["supply_unit"].(string)

				if items["type"] == nil || reflect.TypeOf(items["type"]).String() != "float64" {
					utils.ErrorLog("type")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				is_source := int64(items["type"].(float64))

				if items["supply_manufacturer"] == nil || reflect.TypeOf(items["supply_manufacturer"]).String() != "string" {
					utils.ErrorLog("supply_manufacturer")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				supply_manufacturer := items["supply_manufacturer"].(string)

				if items["count"] == nil || reflect.TypeOf(items["count"]).String() != "string" {
					utils.ErrorLog("count")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				count := items["count"].(string)

				if items["deposit_rate"] == nil || reflect.TypeOf(items["deposit_rate"]).String() != "string" {
					utils.ErrorLog("deposit_rate")
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				deposit_rate := items["deposit_rate"].(string)
				deposit_rate_float, _ := strconv.ParseFloat(deposit_rate, 64)
				if id > 0 {
					cancelOrder := &models.SpSupplierWarehousingCancelOrder{
						ID:                      id,
						ManufacturerId:          manufacturer_id,
						OrderNumber:             order_number,
						ProjectId:               project_id,
						GoodNumber:              good_number,
						IsSource:                is_source,
						Count:                   count,
						Price:                   price_float,
						Remark:                  supply_remake,
						RateOfConcession:        rate_of_concession_float,
						DiscountAmount:          discount_amount_float,
						UserOrgId:               orgId,
						Ctime:                   time.Now().Unix(),
						Status:                  1,
						Mtime:                   0,
						WarehouseCancelId:       warehouse_out_id,
						Type:                    1,
						ReturnNumber:            return_number,
						WarehouseOutId:          warehouse_out_id,
						SupplySpecificationName: supply_specification_name,
						SupplyType:              supply_type,
						SupplyTotal:             supply_total,
						SupplyManufacturer:      supply_manufacturer,
						Name:                    name,
						SupplyUnit:              supply_unit,
						SupplyLicenseNumber:     supply_license_number,
						SupplyCount:             supply_count,
						DepositRate:             deposit_rate_float,
					}
					updateWarehouseCancel = append(updateWarehouseCancel, cancelOrder)
				}

				if id == 0 {
					cancelOrder := &models.SpSupplierWarehousingCancelOrder{
						ManufacturerId:          manufacturer_id,
						OrderNumber:             order_number,
						ProjectId:               project_id,
						GoodNumber:              good_number,
						IsSource:                is_source,
						Count:                   count,
						Price:                   price_float,
						Remark:                  supply_remake,
						RateOfConcession:        rate_of_concession_float,
						DiscountAmount:          discount_amount_float,
						UserOrgId:               orgId,
						Ctime:                   time.Now().Unix(),
						Status:                  1,
						Mtime:                   0,
						WarehouseCancelId:       warehouse_out_id,
						Type:                    2,
						ReturnNumber:            return_number,
						WarehouseOutId:          warehouse_out_id,
						SupplySpecificationName: supply_specification_name,
						SupplyType:              supply_type,
						SupplyTotal:             supply_total,
						SupplyManufacturer:      supply_manufacturer,
						Name:                    name,
						SupplyUnit:              supply_unit,
						SupplyLicenseNumber:     supply_license_number,
						SupplyCount:             supply_count,
						DepositRate:             deposit_rate_float,
					}
					warehouseCancel = append(warehouseCancel, cancelOrder)
				}
			}
		}

		if len(updateWarehouseCancel) > 0 {
			for _, item := range updateWarehouseCancel {

				service.UpdateWarehouseCancelOrder(item)
			}
		}
		if len(warehouseCancel) > 0 {
			for _, item := range warehouseCancel {

				service.CreateCancelReturnOrder(item)
			}
		}
		list, err := service.GetReturnCancelOrderList(warehouse_out_id, orgId)
		if err == nil {
			this.ServeSuccessJSON(map[string]interface{}{
				"list": list,
				"msg":  "msg",
			})
			return

		} else {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
		}
	}
}

func (this *SupplyOrderApiController) ModefyGoodOrder() {

	id, _ := this.GetInt64("id")
	warehousing_id, _ := this.GetInt64("warehousing_id")
	orgId := this.GetAdminUserInfo().CurrentOrgId

	//获取购货单的数据
	goodOrder, _ := service.GetAllGoodOrderById(id, orgId)

	//判断该订单是否有出库记录
	for _, it := range goodOrder {

		if it.IsSource == 1 {
			out, _ := service.GetDrugWarehosueInfoByWarehousingId(it.ProjectId, id, orgId)

			if out.ID > 0 {
				this.ServeSuccessJSON(map[string]interface{}{
					"cancelList":   "",
					"purcaseOrder": "",
					"goodOrder":    "",
					"drugList":     "",
					"msg":          3,
				})
				return
			}
		}
		if it.IsSource == 2 {

			out, _ := service.GetGoodWarehouseInfoByWarehousingId(it.ProjectId, id, orgId)
			if out.ID > 0 {
				this.ServeSuccessJSON(map[string]interface{}{
					"cancelList":   "",
					"purcaseOrder": "",
					"goodOrder":    "",
					"drugList":     "",
					"msg":          3,
				})
				return
			}
		}
	}

	//获取购货订单的数据
	purcaseOrder, _ := service.GetAllPurcaseOrderById(warehousing_id, orgId)

	drugList, _ := service.GetSupplyDrugList(orgId)

	//获取已有关联的退货单
	cancelList, _ := service.GetSupplyCancelWarehouse(id, orgId)
	//查询是否存在退货单
	_, errcode := service.GetSupplyCancelOrderById(id, orgId)
	//无退库单
	if errcode == gorm.ErrRecordNotFound {
		//反审核成功
		out := models.SpSupplierWarehouseOut{
			IsCheck:   2,
			Checker:   0,
			CheckTime: 0,
		}
		err := service.UpdateSupplyGoodOrder(id, out)

		for _, its := range goodOrder {
			//改变采购单状态
			service.UpdateSupplyOrderListById(its.ID)
		}

		//查询该订单不是采购入库的数据
		list, _ := service.GetDrugSupplyWarehousingById(id, orgId)
		if len(list) == 0 {
			service.UpdateSupplyWarehousing(id, orgId)
		}
		goodList, _ := service.GetGoodSupplyWarehousingById(id, orgId)

		if len(goodList) == 0 {
			service.UpdateGoodWarehousing(id, orgId)
		}

		//删除药品入库单
		service.UpdateDrugSupplyWarehousingInfo(id, orgId)

		//删除入库流水
		service.UpdateDrugSupplyFlow(id, orgId)
		// 查询入库单
		drugInfo, _ := service.GetDrugSupplyWarehouseIdSeven(id, orgId)
		if len(drugInfo) > 0 {
			for _, item := range drugInfo {
				//查询默认仓库
				houseConfig, _ := service.GetAllStoreHouseConfig(item.OrgId)
				//查询默认仓库剩余多少库存
				list, _ := service.GetDrugSumCountByStorehouseId(houseConfig.DrugStorehouseOut, item.OrgId, item.DrugId)
				var sum_count int64
				var sum_in_count int64
				for _, it := range list {
					baseDrug, _ := service.GetBaseDrugMedical(it.DrugId)
					if it.MaxUnit == baseDrug.MaxUnit {
						it.StockMaxNumber = it.StockMaxNumber * baseDrug.MinNumber
						it.WarehousingCount = it.WarehousingCount * baseDrug.MinNumber

					}
					sum_count += it.StockMaxNumber + it.StockMinNumber
					sum_in_count += it.WarehousingCount
				}
				service.UpdateMedicalSumCount(item.DrugId, sum_count, sum_in_count, item.OrgId)
			}
		} else {
			for _, it := range goodOrder {
				if it.IsSource == 1 {

					service.UpdateMedicalSumCount(it.ProjectId, 0, 0, this.GetAdminUserInfo().CurrentOrgId)
				}
			}

		}

		//删除耗材入库单
		service.UpdateGoodSupplyWarehousingInfo(id, orgId)

		//删除耗材入库流水
		service.UpdateGoodSupplyFlow(id, orgId)

		//查寻入库单
		info, _ := service.GetSupplySupplyWarehouseIdSeven(id, orgId)
		if len(info) > 0 {
			for _, item := range info {
				//扣减库存
				//查询该机构默认仓库
				storeConfig, _ := service.GetAllStoreHouseConfig(item.OrgId)
				//查询剩余库存
				goodList, _ := service.GetGoodSumCountByStoreId(storeConfig.StorehouseOutInfo, item.GoodId, item.OrgId)
				var sum_count int64
				var sum_in_count int64
				for _, item := range goodList {
					sum_count += item.StockCount
					sum_in_count += item.WarehousingCount
				}
				service.UpdateGoodByGoodId(item.GoodId, sum_count, sum_in_count, item.OrgId)
			}
		} else {
			for _, it := range goodOrder {
				if it.IsSource == 2 {
					service.UpdateGoodByGoodId(it.ProjectId, 0, 0, this.GetAdminUserInfo().CurrentOrgId)
				}
			}
		}

		if err == nil {
			this.ServeSuccessJSON(map[string]interface{}{
				"cancelList":   cancelList,
				"purcaseOrder": purcaseOrder,
				"goodOrder":    goodOrder,
				"drugList":     drugList,
				"msg":          1,
			})
			return
		} else {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
		}
	} else if errcode == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"cancelList":   cancelList,
			"purcaseOrder": purcaseOrder,
			"goodOrder":    goodOrder,
			"drugList":     drugList,
			"msg":          2,
		})
		return
	}

}

func (this *SupplyOrderApiController) UpdateSupplyWarehousing() {

	warehousing_id, _ := this.GetInt64("warehousing_id")
	orgId := this.GetAdminUserInfo().CurrentOrgId
	err := service.UpdateSupplyWarehousingById(warehousing_id, orgId)
	if err == nil {
		returnData := make(map[string]interface{}, 0)
		returnData["msg"] = "ok"
		this.ServeSuccessJSON(returnData)
		return
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) DeleteGoodOrder() {

	id, _ := this.GetInt64("id")
	orgId := this.GetAdminUserInfo().CurrentOrgId
	err := service.DeleteGoodOrder(id, orgId)
	if err == nil {
		returnData := make(map[string]interface{}, 0)
		returnData["msg"] = "ok"
		this.ServeSuccessJSON(returnData)
		return
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) GetSupplyWarehouseById() {

	id, _ := this.GetInt64("id")
	orgId := this.GetAdminUserInfo().CurrentOrgId

	//获取已有关联的退货单
	cancelList, err := service.GetSupplyCancelWarehouse(id, orgId)
	//获取采购单数据
	outList, _ := service.GetGoodOrderListById(id, orgId)
	//获取退货单数据
	cancelOrderList, _ := service.GetGoodCanceListById(id, orgId)
	//获取药品库数据
	baseList, _ := service.GetSupplyDrugList(orgId)
	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"cancelList":      cancelList,
			"outList":         outList,
			"drugList":        baseList,
			"cancelOrderList": cancelOrderList,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) CheckGoodOrderById() {

	id, _ := this.GetInt64("id")
	recordDateStr := time.Now().Format("2006-01-02")
	recordDate, _ := utils.ParseTimeStringToTime("2006-01-02", recordDateStr)

	record_date := recordDate.Unix()
	checker := this.GetAdminUserInfo().AdminUser.Id

	out := models.SpSupplierWarehouseOut{
		IsCheck:   1,
		Checker:   checker,
		CheckTime: record_date,
	}

	err := service.UpdateSupplyGoodOrder(id, out)
	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"out": out,
		})
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) CheckReturnOrder() {

	id, _ := this.GetInt64("id")
	warehouse_out_id, _ := this.GetInt64("warehouse_out_id")
	recordDateStr := time.Now().Format("2006-01-02")
	recordDate, _ := utils.ParseTimeStringToTime("2006-01-02", recordDateStr)
	orgId := this.GetAdminUserInfo().CurrentOrgId
	record_date := recordDate.Unix()
	checker := this.GetAdminUserInfo().AdminUser.Id
	houseConfig, _ := service.GetAllStoreHouseConfig(this.GetAdminUserInfo().CurrentOrgId)
	//获取退库单详情
	list, _ := service.GetSupplyCancelOrderDetail(id, orgId)
	for _, item := range list {

		var total_count int64
		var prescribing_number_total int64
		//药品
		if item.IsSource == 1 {

			//获取药品库存
			info, _ := service.GetDrugTotalCountTwenTy(item.ProjectId, item.SupplyWarehouseDetailInfo, item.Type, houseConfig.DrugStorehouseOut)

			for _, it := range info {

				if it.MaxUnit == it.CountUnit {
					it.StockMaxNumber = it.StockMaxNumber * it.MinNumber

				}
				total_count += (it.StockMaxNumber + it.StockMinNumber)
			}

			//查询改药品信息
			medical, _ := service.GetBaseDrugMedical(item.ProjectId)

			//判断单位是否相等
			if medical.MaxUnit == item.SupplyUnit {
				//转化为最小单位
				prescribing_number_total = item.SupplyCount * medical.MinNumber
			}
			if medical.MinUnit == item.SupplyUnit {
				prescribing_number_total = item.SupplyCount
			}

			//判断单位
			if total_count == 0 {
				goodObj, _ := service.GetDrugByGoodId(item.ProjectId)
				this.ServeSuccessJSON(map[string]interface{}{
					"msg":        "3",
					"drug_name":  goodObj.DrugName,
					"dose":       goodObj.Dose,
					"dose_unit":  goodObj.DoseUnit,
					"min_number": goodObj.MinNumber,
					"min_unit":   goodObj.MinUnit,
					"max_unit":   goodObj.MaxUnit,
				})
				return
			}

			if prescribing_number_total > total_count {

				goodObj, _ := service.GetDrugByGoodId(item.ProjectId)
				this.ServeSuccessJSON(map[string]interface{}{
					"msg":        "3",
					"drug_name":  goodObj.DrugName,
					"dose":       goodObj.Dose,
					"dose_unit":  goodObj.DoseUnit,
					"min_number": goodObj.MinNumber,
					"min_unit":   goodObj.MinUnit,
					"max_unit":   goodObj.MaxUnit,
				})
				return
			}

			ctime := time.Now().Unix()
			timeStr := time.Now().Format("2006-01-02")
			timeArr := strings.Split(timeStr, "-")
			total, _ := service.FindAllDrugWarehouseOut(orgId)

			total = total + 1
			warehousing_out_order := strconv.FormatInt(orgId, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000"
			number, _ := strconv.ParseInt(warehousing_out_order, 10, 64)
			number = number + total
			warehousing_out_order = "YPCKD" + strconv.FormatInt(number, 10)
			//operation_time := time.Now().Unix()
			creater := this.GetAdminUserInfo().AdminUser.Id
			recordDateStr := time.Now().Format("2006-01-02")
			recordDate, _ := utils.ParseTimeStringToTime("2006-01-02", recordDateStr)
			orgId := this.GetAdminUserInfo().CurrentOrgId
			record_date := recordDate.Unix()
			warehouseOut := models.DrugWarehouseOut{
				WarehouseOutOrderNumber: warehousing_out_order,
				OperationTime:           record_date,
				OrgId:                   orgId,
				Creater:                 creater,
				Ctime:                   ctime,
				Status:                  1,
				WarehouseOutTime:        record_date,
				Type:                    1,
				SupplyCancelOutId:       id,
				SupplyWarehouseId:       warehouse_out_id,
				StorehouseId:            houseConfig.DrugStorehouseOut,
				IsCheck:                 1,
			}
			// 查询今日是否存在出库单
			_, errcodes := service.GetDrugWarehouseOutById(orgId, record_date)
			if errcodes == gorm.ErrRecordNotFound {
				service.AddSigleDrugWarehouseOut(&warehouseOut)
			}

			lastDrug, _ := service.GetLastDrugWarehouseById(orgId, record_date)

			//获取
			warehouseOutInfo := &models.DrugWarehouseOutInfo{

				WarehouseOutOrderNumber: lastDrug.WarehouseOutOrderNumber,
				WarehouseOutId:          lastDrug.ID,
				DrugId:                  item.ProjectId,
				Count:                   item.SupplyCount,
				Price:                   item.Price,
				Status:                  1,
				Ctime:                   ctime,
				Remark:                  "",
				OrgId:                   orgId,
				Type:                    1,
				Manufacturer:            item.ManufacturerId,
				Dealer:                  0,
				CountUnit:               item.SupplyUnit,
				ExpiryDate:              item.SupplyExpiryDate,
				ProductDate:             item.SupplyProductDate,
				Number:                  item.SupplyLicenseNumber,
				BatchNumber:             item.SupplyBatchNumber,
				IsSys:                   0,
				WarehouseInfoId:         0,
				SupplyCancelOutId:       id,
				SupplyWarehouseId:       warehouse_out_id,
				SysRecordTime:           record_date,
				IsSource:                item.Type,
				StorehouseId:            houseConfig.DrugStorehouseOut,
				IsCheck:                 1,
			}

			drup, _ := service.FindBaseDrugLibRecord(orgId, item.ProjectId)
			if drup.ID > 0 {
				prescribingNumber := item.SupplyCount
				service.AutoDrugDeliverInfoNight(orgId, prescribingNumber, &warehouseOut, &drup, warehouseOutInfo, warehouse_out_id, id)
			}

			//修改原数据
			/*	orderInfo := models.SpSupplierWarehousingCancelOrder{
					SourceCount: item.SupplyCount - item.SourceCount,
				}
				service.UpdateSupplyCancelById(item.ID, orderInfo)*/
		}

		//耗材
		if item.IsSource == 2 {
			// 查询该耗材是否有库存
			warehouseOne, _ := service.FindWarehousingInfoTwenTy(item.ProjectId, item.SupplyWarehouseDetailInfo, item.Type, houseConfig.StorehouseOutInfo)

			// 如果出库数量大于该批次剩余库存数量
			if item.SupplyCount > warehouseOne.StockCount {

				goodObj, _ := service.GetGoodInformationByGoodId(item.ProjectId)
				this.ServeSuccessJSON(map[string]interface{}{
					"msg":                "2",
					"good_name":          goodObj.GoodName,
					"specification_name": goodObj.SpecificationName,
				})
				return

			}
			ctime := time.Now().Unix()

			timeStr := time.Now().Format("2006-01-02")
			timeArr := strings.Split(timeStr, "-")
			total, _ := service.FindAllWarehouseOut(orgId)

			total = total + 1
			warehousing_out_order := strconv.FormatInt(orgId, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000"
			number, _ := strconv.ParseInt(warehousing_out_order, 10, 64)
			number = number + total
			warehousing_out_order = "CKD" + strconv.FormatInt(number, 10)
			//operation_time := time.Now().Unix()
			creater := this.GetAdminUserInfo().AdminUser.Id
			recordDateStr := time.Now().Format("2006-01-02")
			recordDate, _ := utils.ParseTimeStringToTime("2006-01-02", recordDateStr)

			record_date := recordDate.Unix()
			warehouseOut := models.WarehouseOut{
				WarehouseOutOrderNumber: warehousing_out_order,
				OperationTime:           record_date,
				OrgId:                   orgId,
				Creater:                 creater,
				Ctime:                   ctime,
				Status:                  1,
				WarehouseOutTime:        record_date,
				Type:                    1,
				SupplyCancelOutId:       id,
				SupplyWarehouseId:       warehouse_out_id,
				IsSys:                   0,
				StorehouseId:            houseConfig.StorehouseOutInfo,
				IsCheck:                 1,
			}
			//查询是否生成出库单
			_, errcodes := service.FindStockOutByIsSys(orgId, 0, record_date)
			if errcodes == gorm.ErrRecordNotFound {
				service.AddSigleWarehouseOut(&warehouseOut)
			}
			outWarehouse, _ := service.GetlastWarehouseOutById(orgId, record_date)

			goodObj, _ := service.GetGoodInformationByGoodId(item.ProjectId)
			info := &models.WarehouseOutInfo{
				WarehouseOutOrderNumber: outWarehouse.WarehouseOutOrderNumber,
				WarehouseOutId:          outWarehouse.ID,
				WarehouseInfotId:        0,
				GoodId:                  item.ProjectId,
				GoodTypeId:              goodObj.GoodTypeId,
				Count:                   item.SupplyCount,
				Price:                   item.Price,
				TotalPrice:              0,
				ProductDate:             item.SupplyProductDate,
				ExpiryDate:              item.SupplyExpiryDate,
				Type:                    0,
				Dealer:                  0,
				Manufacturer:            item.ManufacturerId,
				IsSys:                   0,
				SysRecordTime:           record_date,
				Number:                  item.SupplyBatchNumber,
				LicenseNumber:           item.SupplyLicenseNumber,
				ConsumableType:          0,
				SupplyCancelOutId:       id,
				OrgId:                   orgId,
				SupplyWarehouseId:       warehouse_out_id,
				IsSource:                item.Type,
				StorehouseId:            houseConfig.StorehouseOutInfo,
				IsCheck:                 1,
			}
			//出库逻辑
			parseDateErr := service.ConsumablesDeliveryNight(orgId, record_date, info, &warehouseOut, item.SupplyCount, creater, warehouse_out_id, id)

			if parseDateErr != nil {
				utils.ErrorLog(parseDateErr.Error())
				this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeCreateStockInFail)
				return
			}
		}
	}
	cancel := models.SpSupplierWarehouseCancel{
		IsCheck:   1,
		Checker:   checker,
		CheckTime: record_date,
	}
	err := service.CheckReturnOrder(id, orgId, cancel)

	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"msg":        "1",
			"drug_name":  "",
			"dose":       "",
			"dose_unit":  "",
			"min_number": "",
			"min_unit":   "",
			"max_unit":   "",
		})
		return
	}

}

func (this *SupplyOrderApiController) DeletePurchaseOrder() {

	id, _ := this.GetInt64("id")
	err := service.DeletePurchaseOrder(id)
	if err == nil {
		returnData := make(map[string]interface{}, 0)
		returnData["msg"] = "ok"
		this.ServeSuccessJSON(returnData)
		return
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) DeleteGoodOrderById() {
	id, _ := this.GetInt64("id")
	err := service.DeleteGoodOrderById(id)
	if err == nil {
		returnData := make(map[string]interface{}, 0)
		returnData["msg"] = "ok"
		this.ServeSuccessJSON(returnData)
		return
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) DeleteReturnOrder() {

	id, _ := this.GetInt64("id")
	err := service.DeleteReturnOrder(id)
	if err == nil {
		returnData := make(map[string]interface{}, 0)
		returnData["msg"] = "ok"
		this.ServeSuccessJSON(returnData)
		return
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) DeleteReturnOrderById() {

	id, _ := this.GetInt64("id")
	err := service.DeleteReturnOrderById(id)
	if err == nil {
		returnData := make(map[string]interface{}, 0)
		returnData["msg"] = "ok"
		this.ServeSuccessJSON(returnData)
		return
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) ModefyReturnOrder() {
	id, _ := this.GetInt64("id")
	err := service.ModefyReturnOrder(id)
	//获取退库单据日期
	cancel, _ := service.GetReturnOrderById(id)
	orgId := this.GetAdminUserInfo().CurrentOrgId
	if err == nil {
		//获取退库单详情
		list, _ := service.GetSupplyCancelOrderDetail(id, orgId)
		for _, item := range list {

			//药品
			if item.IsSource == 1 {
				base, _ := service.GetDrugDetailByDrugId(item.ProjectId)
				//更改库存
				if item.SupplyUnit == base.MaxUnit {
					//退库
					drugInfo := models.DrugWarehouseInfo{
						StockMaxNumber: item.SupplyCount,
					}

					service.UpdateDrugWasehousring(item.ProjectId, item.SupplyWarehouseDetailInfo, drugInfo)
					var sum_count int64
					sum_count = item.SupplyCount * base.MinNumber
					service.ModifyDrugAddInformation(item.ProjectId, sum_count, orgId)
				}

				if item.SupplyType == base.MinUnit && base.MaxUnit != base.MinUnit {
					drugInfo := models.DrugWarehouseInfo{
						StockMinNumber: item.SupplyCount,
					}
					service.UpdateDrugWasehousringOne(item.ProjectId, item.SupplyWarehouseDetailInfo, drugInfo)
					service.ModifyDrugAddInformation(item.ProjectId, item.SupplyCount, orgId)
				}

				//删除流水
				service.DeleteDrugWarehouseOutNight(item.ProjectId, item.WarehouseCancelId)
				//查询出库订单
				drugOut, _ := service.GetDrugWarehouseByDate(cancel.RecordDate, orgId)

				drugOutList, _ := service.GetDrugWarehouseByIdList(drugOut.ID, orgId)
				if len(drugOutList) == 0 {
					service.UpdateDrugWarehouseById(drugOut.ID)
				}
			}
			//耗材
			if item.IsSource == 2 {

				//退库
				info := models.WarehousingInfo{
					StockCount: item.SupplyCount,
				}

				//更改库存
				err := service.UpdateWarehousingInfoById(item.ProjectId, item.SupplyWarehouseDetailInfo, info)
				service.ModifyGoodAddInformation(item.ProjectId, item.SupplyCount, item.UserOrgId)
				fmt.Println(err)
				//删除出库记录
				service.DeleteGoodWarehouseOut(item.ProjectId, item.WarehouseCancelId, orgId)

				//查询今日的出库单是
				out, _ := service.GetWarehouseOutByDate(cancel.RecordDate, orgId)
				warehouseOutList, _ := service.GetWarehouseOutById(out.ID, orgId)
				if len(warehouseOutList) == 0 {
					//删除出库单
					service.DeleteWarehouseOutById(out.ID)
				}

			}
		}
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}

	if err == nil {
		returnData := make(map[string]interface{}, 0)
		returnData["msg"] = "ok"
		this.ServeSuccessJSON(returnData)
		return
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
	}
}

func (this *SupplyOrderApiController) GetGoodOrderDetailList() {
	id, _ := this.GetInt64("id")
	ids := this.GetString("ids")
	orgId := this.GetAdminUserInfo().CurrentOrgId

	if len(ids) == 0 {
		out, err := service.GetGoodOrderDetail(id, orgId)
		list, _ := service.GetSupplyWarehouseOutById(id, orgId)
		for _, item := range list {

			if item.IsSource == 1 {
				waresingList, _ := service.GetAllDrugWaresingList(item.ProjectId, orgId)
				medical, _ := service.GetBaseDrugMedical(item.ProjectId)
				item.DrugWarehouseInfo = waresingList
				item.SpBaseDrug = medical
			}
			if item.IsSource == 2 {
				waresingList, _ := service.GetAllGoodWaresingList(item.ProjectId, orgId)

				item.GoodWarehouseInfo = waresingList
			}
		}
		drugList, _ := service.GetSupplyDrugList(orgId)
		goodList, _ := service.GetSupplyGoodList(orgId)
		supplyList, _ := service.GetSupplierList(orgId)
		if err == nil {
			this.ServeSuccessJSON(map[string]interface{}{
				"out":        out,
				"list":       list,
				"goodList":   goodList,
				"drugList":   drugList,
				"supplyList": supplyList,
			})
		} else {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
		}
	}
	if len(ids) > 0 {
		idArray := strings.Split(ids, ",")
		out, err := service.GetGoodOrderDetail(id, orgId)
		list, _ := service.GetSupplyWarehouseOutByIdOne(id, orgId, idArray)
		for _, item := range list {
			if item.IsSource == 1 {
				waresingList, _ := service.GetAllDrugWaresingList(item.ProjectId, orgId)
				medical, _ := service.GetBaseDrugMedical(item.ProjectId)
				item.DrugWarehouseInfo = waresingList
				item.SpBaseDrug = medical
			}
			if item.IsSource == 2 {
				waresingList, _ := service.GetAllGoodWaresingList(item.ProjectId, orgId)

				item.GoodWarehouseInfo = waresingList
			}
		}
		drugList, _ := service.GetSupplyDrugList(orgId)
		goodList, _ := service.GetSupplyGoodList(orgId)
		supplyList, _ := service.GetSupplierList(orgId)
		if err == nil {
			this.ServeSuccessJSON(map[string]interface{}{
				"out":        out,
				"list":       list,
				"goodList":   goodList,
				"drugList":   drugList,
				"supplyList": supplyList,
			})
		} else {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
		}
	}
}
