|
@@ -3,7 +3,9 @@ package controllers
|
|
|
import (
|
|
|
"ERP_storage/Nats/NatsServer"
|
|
|
"ERP_storage/conf"
|
|
|
+ "ERP_storage/logs"
|
|
|
"ERP_storage/models/Account"
|
|
|
+ "ERP_storage/models/Basic"
|
|
|
"ERP_storage/models/Contract"
|
|
|
"ERP_storage/models/Stock"
|
|
|
"fmt"
|
|
@@ -11,9 +13,11 @@ import (
|
|
|
"git.baozhida.cn/ERP_libs/lib"
|
|
|
"github.com/beego/beego/v2/adapter/orm"
|
|
|
beego "github.com/beego/beego/v2/server/web"
|
|
|
+ "github.com/robfig/cron/v3"
|
|
|
"math"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
+ "time"
|
|
|
)
|
|
|
|
|
|
type ContractController struct {
|
|
@@ -25,6 +29,27 @@ func (c *ContractController) Prepare() {
|
|
|
c.User = *Account.User_r
|
|
|
}
|
|
|
|
|
|
+func (c *ContractController) Contract_GenT_number() {
|
|
|
+
|
|
|
+ o := orm.NewOrm()
|
|
|
+ ContractDao := Contract.NewContract(o)
|
|
|
+ T_number := ""
|
|
|
+ rand_x := 1
|
|
|
+ for true {
|
|
|
+ T_number = fmt.Sprintf("GZBZD-%s%03d", time.Now().Format("20060102"), rand_x)
|
|
|
+ _, err := ContractDao.Read_Contract_ByT_number(T_number)
|
|
|
+ if err != nil && err.Error() == orm.ErrNoRows.Error() {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ rand_x += 1
|
|
|
+ }
|
|
|
+
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_number}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
func (c *ContractController) Contract_List() {
|
|
|
|
|
|
// 分页参数 初始化
|
|
@@ -128,24 +153,31 @@ func (c *ContractController) Contract_Add() {
|
|
|
|
|
|
T_number := c.GetString("T_number")
|
|
|
T_customer := c.GetString("T_customer")
|
|
|
- T_money, _ := c.GetFloat("T_money")
|
|
|
- T_type, _ := c.GetInt("T_type")
|
|
|
+ T_money, _ := c.GetFloat("T_money") // 总价
|
|
|
+ T_discount, _ := c.GetFloat("T_discount") // 优惠价
|
|
|
T_date := c.GetString("T_date")
|
|
|
T_product := c.GetString("T_product")
|
|
|
T_remark := c.GetString("T_remark")
|
|
|
T_pdf := c.GetString("T_pdf")
|
|
|
+ T_project := c.GetString("T_project")
|
|
|
+ T_recoveries := c.GetString("T_recoveries")
|
|
|
+ T_invoice := c.GetString("T_invoice")
|
|
|
|
|
|
var_ := Contract.Contract{
|
|
|
- T_number: T_number,
|
|
|
- T_customer: T_customer,
|
|
|
- T_money: float32(T_money),
|
|
|
- T_type: T_type,
|
|
|
- T_date: T_date,
|
|
|
- T_out: 1,
|
|
|
- T_State: 3,
|
|
|
- T_remark: T_remark,
|
|
|
- T_pdf: T_pdf,
|
|
|
- T_submit: c.User.T_uuid,
|
|
|
+ T_number: T_number,
|
|
|
+ T_customer: T_customer,
|
|
|
+ T_money: float32(T_money),
|
|
|
+ T_discount: float32(T_discount),
|
|
|
+ T_project: T_project,
|
|
|
+ T_type: 1, //合同类型 1-销售合同 2-验证合同
|
|
|
+ T_date: T_date,
|
|
|
+ T_out: 1,
|
|
|
+ T_State: 3,
|
|
|
+ T_remark: T_remark,
|
|
|
+ T_pdf: T_pdf,
|
|
|
+ T_submit: c.User.T_uuid,
|
|
|
+ T_recoveries: T_recoveries,
|
|
|
+ T_invoice: T_invoice,
|
|
|
}
|
|
|
|
|
|
o := orm.NewOrm()
|
|
@@ -161,7 +193,7 @@ func (c *ContractController) Contract_Add() {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- Id, err := ContractDao.Add_Contract(var_)
|
|
|
+ _, err = ContractDao.Add_Contract(var_)
|
|
|
if err != nil {
|
|
|
o.Rollback()
|
|
|
c.Data["json"] = lib.JSONS{Code: 203, Msg: "添加失败"}
|
|
@@ -169,15 +201,6 @@ func (c *ContractController) Contract_Add() {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- //合同类型 1-销售合同 2-验证合同
|
|
|
- if T_type == 2 {
|
|
|
- o.Commit()
|
|
|
- NatsServer.AddUserLogs(c.User.T_uuid, "合同", "添加", var_)
|
|
|
- c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Id}
|
|
|
- c.ServeJSON()
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
if len(T_product) == 0 {
|
|
|
o.Rollback()
|
|
|
c.Data["json"] = lib.JSONS{Code: 202, Msg: "销售合同产品明细不能为空"}
|
|
@@ -240,10 +263,10 @@ func (c *ContractController) Contract_Approval() {
|
|
|
return
|
|
|
}
|
|
|
if T_state == 1 {
|
|
|
- NatsServer.AddNews(contract.T_submit, fmt.Sprintf("您提交的合同(%s)【审核已通过】", T_number), conf.ContractApprovalUrl)
|
|
|
+ NatsServer.AddNews(contract.T_submit, fmt.Sprintf("【合同审核】您提交的合同(%s)审核已通过", T_number), conf.ContractApprovalUrl)
|
|
|
}
|
|
|
if T_state == 2 {
|
|
|
- NatsServer.AddNews(contract.T_submit, fmt.Sprintf("您提交的合同(%s)【审核未通过】", T_number), "")
|
|
|
+ NatsServer.AddNews(contract.T_submit, fmt.Sprintf("【合同审核】您提交的合同(%s)审核未通过", T_number), conf.ContractApprovalUrl)
|
|
|
}
|
|
|
NatsServer.AddUserLogs(c.User.T_uuid, "合同", "审核", contract)
|
|
|
|
|
@@ -259,6 +282,9 @@ func (c *ContractController) Contract_Edit() {
|
|
|
T_product := c.GetString("T_product")
|
|
|
T_remark := c.GetString("T_remark")
|
|
|
T_pdf := c.GetString("T_pdf")
|
|
|
+ T_project := c.GetString("T_project")
|
|
|
+ T_recoveries := c.GetString("T_recoveries")
|
|
|
+ T_invoice := c.GetString("T_invoice")
|
|
|
|
|
|
o := orm.NewOrm()
|
|
|
o.Begin()
|
|
@@ -288,13 +314,22 @@ func (c *ContractController) Contract_Edit() {
|
|
|
if len(T_pdf) > 0 {
|
|
|
contract.T_pdf = T_pdf
|
|
|
}
|
|
|
+ if len(T_project) > 0 {
|
|
|
+ contract.T_project = T_project
|
|
|
+ }
|
|
|
+ if len(T_recoveries) > 0 {
|
|
|
+ contract.T_recoveries = T_recoveries
|
|
|
+ }
|
|
|
+ if len(T_invoice) > 0 {
|
|
|
+ contract.T_invoice = T_invoice
|
|
|
+ }
|
|
|
|
|
|
//1-已通过 2-未通过 3-待审核 合同状态为未通过,修改之后将状态更改为待审核
|
|
|
if contract.T_State == 2 {
|
|
|
contract.T_State = 3
|
|
|
}
|
|
|
|
|
|
- err = ContractDao.Update_Contract(contract, "T_customer", "T_money", "T_date", "T_remark", "T_pdf")
|
|
|
+ err = ContractDao.Update_Contract(contract, "T_customer", "T_money", "T_date", "T_remark", "T_pdf", "T_State", "T_project", "T_recoveries", "T_invoice")
|
|
|
if err != nil {
|
|
|
o.Rollback()
|
|
|
c.Data["json"] = lib.JSONS{Code: 203, Msg: "添加失败"}
|
|
@@ -304,8 +339,8 @@ func (c *ContractController) Contract_Edit() {
|
|
|
|
|
|
//合同类型 1-销售合同 2-验证合同
|
|
|
if contract.T_type == 2 {
|
|
|
+ o.Commit()
|
|
|
NatsServer.AddUserLogs(c.User.T_uuid, "合同", "修改", contract)
|
|
|
-
|
|
|
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: contract.Id}
|
|
|
c.ServeJSON()
|
|
|
return
|
|
@@ -318,41 +353,103 @@ func (c *ContractController) Contract_Edit() {
|
|
|
return
|
|
|
}
|
|
|
productList := lib.SplitString(T_product, "|")
|
|
|
+
|
|
|
+ cpl, _ := ContractProductDao.Read_ContractProductList_ByT_number(T_number)
|
|
|
+ needToDeleteList, allList := Check_NeedToDelete_Product_List(productList, cpl)
|
|
|
+ // 检查编辑时需要修改的产品
|
|
|
+ for k, v := range needToDeleteList {
|
|
|
+ id, _ := strconv.Atoi(strings.Split(k, "-")[0])
|
|
|
+ productId, _ := strconv.Atoi(strings.Split(k, "-")[1])
|
|
|
+ if v > 0 {
|
|
|
+ o.Rollback()
|
|
|
+ product, _ := Basic.Read_Product_ById(productId)
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("%s已(部分)出库,禁止删除!", product.T_name)}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ cp := Contract.ContractProduct{Id: id}
|
|
|
+ err = ContractProductDao.Delete_ContractProduct(cp)
|
|
|
+ if err != nil {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //for _, v := range productList {
|
|
|
+ // product_id, _ := strconv.Atoi(strings.Split(v, ",")[0])
|
|
|
+ // num, _ := strconv.Atoi(strings.Split(v, ",")[1])
|
|
|
+ //
|
|
|
+ // var cp Contract.ContractProduct
|
|
|
+ // cp, err = ContractProductDao.Read_ContractProduct_ByT_number_T_product_id(T_number, product_id)
|
|
|
+ // if err != nil {
|
|
|
+ // if err.Error() == orm.ErrNoRows.Error() {
|
|
|
+ // contractProduct := Contract.ContractProduct{
|
|
|
+ // T_contract_number: T_number,
|
|
|
+ // T_product_id: product_id,
|
|
|
+ // T_product_total: num,
|
|
|
+ // T_product_out: 0, // 已出库数量
|
|
|
+ // T_State: 1, // 1-未出库 2-已部分出库 3-已全部出库
|
|
|
+ // }
|
|
|
+ // _, err = ContractProductDao.Add_ContractProduct(contractProduct)
|
|
|
+ // if err != nil {
|
|
|
+ // o.Rollback()
|
|
|
+ // c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
|
|
|
+ // c.ServeJSON()
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // } else {
|
|
|
+ // o.Rollback()
|
|
|
+ // c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
|
|
|
+ // c.ServeJSON()
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // // 修改产品总数量
|
|
|
+ // if cp.T_product_total == num {
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // cp.T_product_total = num
|
|
|
+ // err = ContractProductDao.Update_ContractProduct(cp, "T_product_total")
|
|
|
+ // if err != nil {
|
|
|
+ // o.Rollback()
|
|
|
+ // c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
|
|
|
+ // c.ServeJSON()
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ //}
|
|
|
for _, v := range productList {
|
|
|
product_id, _ := strconv.Atoi(strings.Split(v, ",")[0])
|
|
|
num, _ := strconv.Atoi(strings.Split(v, ",")[1])
|
|
|
-
|
|
|
- var cp Contract.ContractProduct
|
|
|
- cp, err = ContractProductDao.Read_ContractProduct_ByT_number_T_product_id(T_number, product_id)
|
|
|
- if err != nil {
|
|
|
- if err.Error() == orm.ErrNoRows.Error() {
|
|
|
- contractProduct := Contract.ContractProduct{
|
|
|
- T_contract_number: T_number,
|
|
|
- T_product_id: product_id,
|
|
|
- T_product_total: num,
|
|
|
- T_product_out: 0, // 已出库数量
|
|
|
- T_State: 1, // 1-未出库 2-已部分出库 3-已全部出库
|
|
|
- }
|
|
|
- _, err = ContractProductDao.Add_ContractProduct(contractProduct)
|
|
|
- if err != nil {
|
|
|
- o.Rollback()
|
|
|
- c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
|
|
|
- c.ServeJSON()
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- } else {
|
|
|
+ oldContractProduct, ok := allList[product_id]
|
|
|
+ if !ok {
|
|
|
+ contractProduct := Contract.ContractProduct{
|
|
|
+ T_contract_number: T_number,
|
|
|
+ T_product_id: product_id,
|
|
|
+ T_product_total: num,
|
|
|
+ T_product_out: 0, // 已出库数量
|
|
|
+ T_State: 1, // 1-未出库 2-已部分出库 3-已全部出库
|
|
|
+ }
|
|
|
+ _, err = ContractProductDao.Add_ContractProduct(contractProduct)
|
|
|
+ if err != nil {
|
|
|
o.Rollback()
|
|
|
c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
|
|
|
c.ServeJSON()
|
|
|
return
|
|
|
+ } else {
|
|
|
+ continue
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
// 修改产品总数量
|
|
|
- if cp.T_product_total == num {
|
|
|
+ contractProductId, _ := strconv.Atoi(strings.Split(oldContractProduct, "-")[0])
|
|
|
+ oldNum, _ := strconv.Atoi(strings.Split(oldContractProduct, "-")[1])
|
|
|
+ if oldNum == num {
|
|
|
continue
|
|
|
}
|
|
|
- cp.T_product_total = num
|
|
|
+ cp := Contract.ContractProduct{Id: contractProductId, T_product_total: num}
|
|
|
err = ContractProductDao.Update_ContractProduct(cp, "T_product_total")
|
|
|
if err != nil {
|
|
|
o.Rollback()
|
|
@@ -473,7 +570,7 @@ func (c *ContractController) Contract_Product_List() {
|
|
|
return
|
|
|
}
|
|
|
if contract.T_type == 2 {
|
|
|
- c.Data["json"] = lib.JSONS{Code: 202, Msg: "验证合同无产品列表!"}
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
|
|
|
c.ServeJSON()
|
|
|
return
|
|
|
}
|
|
@@ -492,3 +589,549 @@ func (c *ContractController) Contract_Product_List() {
|
|
|
c.ServeJSON()
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+// 检查需要删除的合同产品列表
|
|
|
+func Check_NeedToDelete_Product_List(list []string, newList []Contract.ContractProduct) (needToDelete map[string]int, all map[int]string) {
|
|
|
+
|
|
|
+ var productMap = map[int]int{}
|
|
|
+ needToDelete = make(map[string]int)
|
|
|
+ all = make(map[int]string)
|
|
|
+ for _, v := range list {
|
|
|
+ product_id, _ := strconv.Atoi(strings.Split(v, ",")[0])
|
|
|
+ num, _ := strconv.Atoi(strings.Split(v, ",")[1])
|
|
|
+ productMap[product_id] = num
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, product := range newList {
|
|
|
+ all[product.T_product_id] = fmt.Sprintf("%d-%d", product.Id, product.T_product_total)
|
|
|
+ _, ok := productMap[product.T_product_id]
|
|
|
+ if !ok {
|
|
|
+ id := fmt.Sprintf("%d-%d", product.Id, product.T_product_id)
|
|
|
+ needToDelete[id] = product.T_product_out
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+// 验证合同
|
|
|
+func (c *ContractController) VerifyContract_List() {
|
|
|
+
|
|
|
+ // 分页参数 初始化
|
|
|
+ page, _ := c.GetInt("page")
|
|
|
+ if page < 1 {
|
|
|
+ page = 1
|
|
|
+ }
|
|
|
+ page_z, _ := c.GetInt("page_z")
|
|
|
+ if page_z < 1 {
|
|
|
+ page_z = conf.Page_size
|
|
|
+ }
|
|
|
+ T_customer_id := c.GetString("T_customer_id")
|
|
|
+
|
|
|
+ // 查询
|
|
|
+ T_name := c.GetString("T_name")
|
|
|
+
|
|
|
+ userList, _ := NatsServer.Read_User_List_All()
|
|
|
+ Account.Read_User_All_Map(userList)
|
|
|
+
|
|
|
+ ContractDao := Contract.NewContract(orm.NewOrm())
|
|
|
+ R_List, R_cnt := ContractDao.Read_VerifyContract_List(T_name, T_customer_id, page, page_z)
|
|
|
+
|
|
|
+ var r_jsons lib.R_JSONS
|
|
|
+ r_jsons.Num = R_cnt
|
|
|
+ r_jsons.Data = R_List
|
|
|
+ r_jsons.Page = page
|
|
|
+ r_jsons.Page_size = int(math.Ceil(float64(R_cnt) / float64(page_z)))
|
|
|
+
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// 验证合同呢添加
|
|
|
+func (c *ContractController) VerifyContract_Add() {
|
|
|
+
|
|
|
+ T_number := c.GetString("T_number")
|
|
|
+ T_customer_id := c.GetString("T_customer_id")
|
|
|
+ T_money, _ := c.GetFloat("T_money")
|
|
|
+ T_discount, _ := c.GetFloat("T_discount")
|
|
|
+ T_date := c.GetString("T_date")
|
|
|
+ T_product := c.GetString("T_product")
|
|
|
+ T_remark := c.GetString("T_remark")
|
|
|
+ T_pdf := c.GetString("T_pdf")
|
|
|
+ T_project := c.GetString("T_project")
|
|
|
+ T_recoveries := c.GetString("T_recoveries")
|
|
|
+ T_invoice := c.GetString("T_invoice")
|
|
|
+ T_start_date := c.GetString("T_start_date")
|
|
|
+ T_end_date := c.GetString("T_end_date")
|
|
|
+
|
|
|
+ var_ := Contract.Contract{
|
|
|
+ T_number: T_number,
|
|
|
+ T_customer_id: T_customer_id,
|
|
|
+ T_money: float32(T_money),
|
|
|
+ T_discount: float32(T_discount),
|
|
|
+ T_project: T_project,
|
|
|
+ T_type: 2, //合同类型 1-销售合同 2-验证合同
|
|
|
+ T_date: T_date,
|
|
|
+ T_State: 1,
|
|
|
+ T_remark: T_remark,
|
|
|
+ T_pdf: T_pdf,
|
|
|
+ T_submit: c.User.T_uuid,
|
|
|
+ T_recoveries: T_recoveries,
|
|
|
+ T_invoice: T_invoice,
|
|
|
+ T_start_date: T_start_date,
|
|
|
+ T_end_date: T_end_date,
|
|
|
+ }
|
|
|
+
|
|
|
+ o := orm.NewOrm()
|
|
|
+ o.Begin()
|
|
|
+ ContractDao := Contract.NewContract(o)
|
|
|
+ ContractProductDao := Contract.NewContractProduct(o)
|
|
|
+
|
|
|
+ _, err := ContractDao.Read_Contract_ByT_date(T_customer_id, T_start_date, T_end_date)
|
|
|
+ if err == nil {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "合同签约时间重复!"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ _, err = ContractDao.Read_Contract_ByT_number(T_number)
|
|
|
+ if err == nil {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "合同编号重复!"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = ContractDao.Add_Contract(var_)
|
|
|
+ if err != nil {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 203, Msg: "添加失败"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(T_product) == 0 {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "销售合同产品明细不能为空"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ productList := lib.SplitString(T_product, "|")
|
|
|
+ for _, v := range productList {
|
|
|
+ product_id, _ := strconv.Atoi(strings.Split(v, ",")[0])
|
|
|
+ num, _ := strconv.Atoi(strings.Split(v, ",")[1])
|
|
|
+ contractProduct := Contract.ContractProduct{
|
|
|
+ T_contract_number: T_number,
|
|
|
+ T_product_id: product_id,
|
|
|
+ T_product_total: num,
|
|
|
+ T_product_out: 0, // 已出库数量
|
|
|
+ T_State: 1, // 1-未出库 2-已部分出库 3-已全部出库
|
|
|
+ }
|
|
|
+ _, err = ContractProductDao.Add_ContractProduct(contractProduct)
|
|
|
+ if err != nil {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ o.Commit()
|
|
|
+
|
|
|
+ err = Update_VerifyContract_State(T_customer_id, "ADD")
|
|
|
+ if err != nil {
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "更新状态失败"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ NatsServer.AddUserLogs(c.User.T_uuid, "验证合同", "添加", var_)
|
|
|
+
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_number}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// 验证合同呢修改
|
|
|
+func (c *ContractController) VerifyContract_Edit() {
|
|
|
+ T_number := c.GetString("T_number")
|
|
|
+ T_money, _ := c.GetFloat("T_money")
|
|
|
+ T_date := c.GetString("T_date")
|
|
|
+ T_product := c.GetString("T_product")
|
|
|
+ T_remark := c.GetString("T_remark")
|
|
|
+ T_pdf := c.GetString("T_pdf")
|
|
|
+ T_project := c.GetString("T_project")
|
|
|
+ T_recoveries := c.GetString("T_recoveries")
|
|
|
+ T_invoice := c.GetString("T_invoice")
|
|
|
+ T_start_date := c.GetString("T_start_date")
|
|
|
+ T_end_date := c.GetString("T_end_date")
|
|
|
+
|
|
|
+ o := orm.NewOrm()
|
|
|
+ o.Begin()
|
|
|
+ ContractDao := Contract.NewContract(o)
|
|
|
+ ContractProductDao := Contract.NewContractProduct(o)
|
|
|
+
|
|
|
+ contract, err := ContractDao.Read_Contract_ByT_number(T_number)
|
|
|
+ if err != nil || contract.T_type == 1 {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_number Err!"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if T_money > 0 {
|
|
|
+ contract.T_money = float32(T_money)
|
|
|
+ }
|
|
|
+ if len(T_date) > 0 {
|
|
|
+ contract.T_date = T_date
|
|
|
+ }
|
|
|
+ if len(T_remark) > 0 {
|
|
|
+ contract.T_remark = T_remark
|
|
|
+ }
|
|
|
+ if len(T_pdf) > 0 {
|
|
|
+ contract.T_pdf = T_pdf
|
|
|
+ }
|
|
|
+ if len(T_project) > 0 {
|
|
|
+ contract.T_project = T_project
|
|
|
+ }
|
|
|
+ if len(T_recoveries) > 0 {
|
|
|
+ contract.T_recoveries = T_recoveries
|
|
|
+ }
|
|
|
+ if len(T_invoice) > 0 {
|
|
|
+ contract.T_invoice = T_invoice
|
|
|
+ }
|
|
|
+ if len(T_start_date) > 0 {
|
|
|
+ contract.T_start_date = T_start_date
|
|
|
+ }
|
|
|
+ if len(T_end_date) > 0 {
|
|
|
+ contract.T_end_date = T_end_date
|
|
|
+ }
|
|
|
+
|
|
|
+ err = ContractDao.Update_Contract(contract, "T_money", "T_date", "T_remark", "T_pdf", "T_State", "T_project", "T_recoveries", "T_invoice", "T_start_date", "T_end_date")
|
|
|
+ if err != nil {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 203, Msg: "添加失败"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(T_product) == 0 {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "产品明细不能为空"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ productList := lib.SplitString(T_product, "|")
|
|
|
+
|
|
|
+ cpl, _ := ContractProductDao.Read_ContractProductList_ByT_number(T_number)
|
|
|
+ needToDeleteList, allList := Check_NeedToDelete_Product_List(productList, cpl)
|
|
|
+ // 检查编辑时需要修改的产品
|
|
|
+ for k, v := range needToDeleteList {
|
|
|
+ id, _ := strconv.Atoi(strings.Split(k, "-")[0])
|
|
|
+ productId, _ := strconv.Atoi(strings.Split(k, "-")[1])
|
|
|
+ if v > 0 {
|
|
|
+ o.Rollback()
|
|
|
+ product, _ := Basic.Read_Product_ById(productId)
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("%s已(部分)出库,禁止删除!", product.T_name)}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ cp := Contract.ContractProduct{Id: id}
|
|
|
+ err = ContractProductDao.Delete_ContractProduct(cp)
|
|
|
+ if err != nil {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for _, v := range productList {
|
|
|
+ product_id, _ := strconv.Atoi(strings.Split(v, ",")[0])
|
|
|
+ num, _ := strconv.Atoi(strings.Split(v, ",")[1])
|
|
|
+ oldContractProduct, ok := allList[product_id]
|
|
|
+ if !ok {
|
|
|
+ contractProduct := Contract.ContractProduct{
|
|
|
+ T_contract_number: T_number,
|
|
|
+ T_product_id: product_id,
|
|
|
+ T_product_total: num,
|
|
|
+ T_product_out: 0, // 已出库数量
|
|
|
+ T_State: 1, // 1-未出库 2-已部分出库 3-已全部出库
|
|
|
+ }
|
|
|
+ _, err = ContractProductDao.Add_ContractProduct(contractProduct)
|
|
|
+ if err != nil {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 修改产品总数量
|
|
|
+ contractProductId, _ := strconv.Atoi(strings.Split(oldContractProduct, "-")[0])
|
|
|
+ oldNum, _ := strconv.Atoi(strings.Split(oldContractProduct, "-")[1])
|
|
|
+ if oldNum == num {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ cp := Contract.ContractProduct{Id: contractProductId, T_product_total: num}
|
|
|
+ err = ContractProductDao.Update_ContractProduct(cp, "T_product_total")
|
|
|
+ if err != nil {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ o.Commit()
|
|
|
+
|
|
|
+ err = Update_VerifyContract_State(contract.T_customer_id, "UPDATE")
|
|
|
+ if err != nil {
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "更新状态失败"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ NatsServer.AddUserLogs(c.User.T_uuid, "验证合同", "修改", contract)
|
|
|
+
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: contract.Id}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (c *ContractController) VerifyContract_Del() {
|
|
|
+
|
|
|
+ T_number := c.GetString("T_number")
|
|
|
+
|
|
|
+ o := orm.NewOrm()
|
|
|
+ o.Begin()
|
|
|
+ ContractDao := Contract.NewContract(o)
|
|
|
+ ContractProductDao := Contract.NewContractProduct(o)
|
|
|
+
|
|
|
+ contract, err := ContractDao.Read_Contract_ByT_number(T_number)
|
|
|
+ if err != nil {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_number Err!"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = ContractDao.Delete_Contract(contract)
|
|
|
+ if err != nil {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ cpList := ContractProductDao.Read_ContractProduct_List(T_number)
|
|
|
+ for _, v := range cpList {
|
|
|
+ err = ContractProductDao.Delete_ContractProduct(v)
|
|
|
+ if err != nil {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ o.Commit()
|
|
|
+
|
|
|
+ err = Update_VerifyContract_State(contract.T_customer_id, "DELETE")
|
|
|
+ if err != nil {
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改状态失败"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ NatsServer.AddUserLogs(c.User.T_uuid, "验证合同", "删除", T_number)
|
|
|
+
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_number}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func Update_VerifyContract_State(T_customer_id, flag string) error {
|
|
|
+ o := orm.NewOrm()
|
|
|
+ ContractDao := Contract.NewContract(o)
|
|
|
+ VerifyContractDao := Contract.NewVerifyContract(o)
|
|
|
+ vcn := ContractDao.Read_VerifyContract_Newest(T_customer_id)
|
|
|
+ vc, err := VerifyContractDao.Read_VerifyContract_ByT_customer_id(T_customer_id)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if vcn.Id == 0 {
|
|
|
+ vc.T_sign_times = 0
|
|
|
+ vc.T_start_date = ""
|
|
|
+ vc.T_end_date = ""
|
|
|
+ vc.T_State = 1
|
|
|
+ err = VerifyContractDao.Update_VerifyContract(vc, "T_start_date", "T_end_date", "T_sign_times", "T_State")
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if flag == "ADD" {
|
|
|
+ vc.T_sign_times += 1
|
|
|
+ } else if flag == "DELETE" {
|
|
|
+ vc.T_sign_times -= 1
|
|
|
+ }
|
|
|
+ if len(vc.T_start_date) == 0 {
|
|
|
+ vc.T_start_date = vcn.T_start_date
|
|
|
+ }
|
|
|
+ if vc.T_end_date != vcn.T_end_date {
|
|
|
+ vc.T_end_date = vcn.T_end_date
|
|
|
+ }
|
|
|
+ nowTime := time.Now()
|
|
|
+ now := time.Date(nowTime.Year(), nowTime.Month(), nowTime.Day(), 0, 0, 0, 0, time.Local)
|
|
|
+ end, _ := lib.DateStrToTime(vcn.T_end_date)
|
|
|
+ now2Month := now.AddDate(0, 2, 0)
|
|
|
+ // 1-未签约 2-已作废 3-已签约 4-即将到期
|
|
|
+ state := 1
|
|
|
+ // 结束时间<今天 已过期
|
|
|
+ if end.Before(now) {
|
|
|
+ state = 2
|
|
|
+ } else {
|
|
|
+ // 结束时间<今天+2月 即将到期 && 结束时间>今天
|
|
|
+ if end.Before(now2Month) || end.Equal(now) {
|
|
|
+ state = 4
|
|
|
+ NatsServer.AddNews(vcn.T_approver, fmt.Sprintf("【合同即将过期提醒】%s的验证合同将于%s过期!", vc.T_customer, vc.T_end_date), conf.VerifyContractUrl)
|
|
|
+ }
|
|
|
+ // 结束时间>今天+2月 已签约
|
|
|
+ if end.After(now2Month) || end.Equal(now2Month) {
|
|
|
+ state = 3
|
|
|
+ }
|
|
|
+ }
|
|
|
+ vc.T_State = state
|
|
|
+ err = VerifyContractDao.Update_VerifyContract(vc, "T_start_date", "T_end_date", "T_sign_times", "T_State")
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
+// 验证合同-添加客户
|
|
|
+func (c *ContractController) VerifyContract_Add_Customer() {
|
|
|
+
|
|
|
+ T_customer := c.GetString("T_customer")
|
|
|
+
|
|
|
+ o := orm.NewOrm()
|
|
|
+ VerifyContractDao := Contract.NewVerifyContract(o)
|
|
|
+
|
|
|
+ T_number := ""
|
|
|
+ for true {
|
|
|
+ rand_x := 1
|
|
|
+ T_number = fmt.Sprintf("YZKH-%s", lib.GetRandstring(8, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", int64(rand_x)))
|
|
|
+ _, err := VerifyContractDao.Read_VerifyContract_ByT_customer_id(T_number)
|
|
|
+ if err != nil && err.Error() == orm.ErrNoRows.Error() {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ rand_x += 1
|
|
|
+ }
|
|
|
+
|
|
|
+ var_ := Contract.VerifyContract{
|
|
|
+ T_customer: T_customer,
|
|
|
+ T_customer_id: T_number,
|
|
|
+ T_State: 1,
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err := VerifyContractDao.Add_VerifyContract(var_)
|
|
|
+ if err != nil {
|
|
|
+ o.Rollback()
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ NatsServer.AddUserLogs(c.User.T_uuid, "验证合同", "添加客户", var_)
|
|
|
+
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_number}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// 验证合同-编辑客户
|
|
|
+func (c *ContractController) VerifyContract_Update_Customer() {
|
|
|
+
|
|
|
+ T_customer_id := c.GetString("T_customer_id")
|
|
|
+ T_customer := c.GetString("T_customer")
|
|
|
+
|
|
|
+ o := orm.NewOrm()
|
|
|
+ VerifyContractDao := Contract.NewVerifyContract(o)
|
|
|
+ vc, err := VerifyContractDao.Read_VerifyContract_ByT_customer_id(T_customer_id)
|
|
|
+
|
|
|
+ vc.T_customer = T_customer
|
|
|
+
|
|
|
+ err = VerifyContractDao.Update_VerifyContract(vc)
|
|
|
+ if err != nil {
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ NatsServer.AddUserLogs(c.User.T_uuid, "验证合同", "编辑客户", vc)
|
|
|
+
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_customer_id}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// 验证合同-客户列表
|
|
|
+func (c *ContractController) VerifyContract_Customer_List() {
|
|
|
+
|
|
|
+ // 分页参数 初始化
|
|
|
+ page, _ := c.GetInt("page")
|
|
|
+ if page < 1 {
|
|
|
+ page = 1
|
|
|
+ }
|
|
|
+ page_z, _ := c.GetInt("page_z")
|
|
|
+ if page_z < 1 {
|
|
|
+ page_z = conf.Page_size
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询
|
|
|
+ T_name := c.GetString("T_name")
|
|
|
+ T_state, _ := c.GetInt("T_state")
|
|
|
+
|
|
|
+ VerifyContractDao := Contract.NewVerifyContract(orm.NewOrm())
|
|
|
+ R_List, R_cnt := VerifyContractDao.Read_VerifyContract_List(T_name, T_state, page, page_z)
|
|
|
+
|
|
|
+ var r_jsons lib.R_JSONS
|
|
|
+ r_jsons.Num = R_cnt
|
|
|
+ r_jsons.Data = R_List
|
|
|
+ r_jsons.Page = page
|
|
|
+ r_jsons.Page_size = int(math.Ceil(float64(R_cnt) / float64(page_z)))
|
|
|
+
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
|
|
|
+ c.ServeJSON()
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func Cron_VerifyContract() {
|
|
|
+
|
|
|
+ //创建一个定时任务对象
|
|
|
+ c := cron.New(cron.WithSeconds())
|
|
|
+ //给对象增加定时任务
|
|
|
+ //c.AddFunc("0 */1 * * * ?", Cron_VerifyContract_ChangeState)
|
|
|
+ c.AddFunc("@daily", Cron_VerifyContract_ChangeState)
|
|
|
+
|
|
|
+ //启动定时任务
|
|
|
+ c.Start()
|
|
|
+ defer c.Stop()
|
|
|
+
|
|
|
+ //查询语句,阻塞,让main函数不退出,保持程序运行
|
|
|
+ select {}
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+// 修改合同状态
|
|
|
+func Cron_VerifyContract_ChangeState() {
|
|
|
+
|
|
|
+ T_date := time.Now().Format("2006-01-02")
|
|
|
+ logs.Info("开始处理" + T_date + "验证合同状态")
|
|
|
+ VerifyContractDao := Contract.NewVerifyContract(orm.NewOrm())
|
|
|
+ R_List, _ := VerifyContractDao.Read_VerifyContract_List("", 0, 0, 999)
|
|
|
+ for _, v := range R_List {
|
|
|
+ err := Update_VerifyContract_State(v.T_customer_id, "UPDATE")
|
|
|
+ if err != nil {
|
|
|
+ logs.Error("修改合同状态失败")
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|