Browse Source

2023-04-28

zoie 1 year ago
parent
commit
ab757511b1

+ 12 - 0
Nats/NatsServer/NatsERP_user.go

@@ -4,6 +4,7 @@ import (
 	"ERP_storage/Nats"
 	"ERP_storage/logs"
 	natslibs "git.baozhida.cn/ERP_libs/Nats"
+	powerlibs "git.baozhida.cn/ERP_libs/Power"
 	userlibs "git.baozhida.cn/ERP_libs/User"
 	"git.baozhida.cn/ERP_libs/lib"
 )
@@ -32,6 +33,17 @@ func Read_User_List_All() (user []userlibs.User, err error) {
 
 }
 
+func Read_Power_List_All() (power []powerlibs.Power_R, err error) {
+	nats := natslibs.NewNats(Nats.Nats)
+	power, err = nats.Read_Power_List_All()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return power, err
+	}
+	return power, nil
+
+}
+
 // 添加系统日志
 func AddSysLogs(T_class, T_title string, T_txt interface{}) {
 	nats := natslibs.NewNats(Nats.Nats)

+ 6 - 0
controllers/Basic.go

@@ -295,6 +295,12 @@ func (c *BasicController) Product_Add() {
 	T_img := c.GetString("T_img")
 	T_remark := c.GetString("T_remark")
 
+	if len(T_name) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "产品名称不能为空!"}
+		c.ServeJSON()
+		return
+	}
+
 	var_ := Basic.Product{
 		T_name:        T_name,
 		T_class:       T_class,

+ 10 - 8
controllers/Contract.go

@@ -171,8 +171,8 @@ func (c *ContractController) Contract_Add() {
 
 	//合同类型 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
@@ -268,7 +268,7 @@ func (c *ContractController) Contract_Edit() {
 	contract, err := ContractDao.Read_Contract_ByT_number(T_number)
 	if err != nil {
 		o.Rollback()
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_number Err!"}
 		c.ServeJSON()
 		return
 	}
@@ -341,12 +341,14 @@ func (c *ContractController) Contract_Edit() {
 					return
 				}
 
+			} else {
+				o.Rollback()
+				c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
+				c.ServeJSON()
+				return
 			}
-			o.Rollback()
-			c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
-			c.ServeJSON()
-			return
 		}
+		// 修改产品总数量
 		if cp.T_product_total == num {
 			continue
 		}
@@ -381,7 +383,7 @@ func (c *ContractController) Contract_Del() {
 	contract, err := ContractDao.Read_Contract_ByT_number(T_number)
 	if err != nil {
 		o.Rollback()
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_number Err!"}
 		c.ServeJSON()
 		return
 	}
@@ -396,7 +398,7 @@ func (c *ContractController) Contract_Del() {
 	err = ContractDao.Delete_Contract(contract)
 	if err != nil {
 		o.Rollback()
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_number Err!"}
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
 		c.ServeJSON()
 		return
 	}

+ 57 - 24
controllers/Stock.go

@@ -1,6 +1,7 @@
 package controllers
 
 import (
+	"ERP_storage/Nats"
 	"ERP_storage/Nats/NatsServer"
 	"ERP_storage/conf"
 	"ERP_storage/logs"
@@ -10,6 +11,7 @@ import (
 	"ERP_storage/models/Property"
 	"ERP_storage/models/Stock"
 	"fmt"
+	natslibs "git.baozhida.cn/ERP_libs/Nats"
 	userlibs "git.baozhida.cn/ERP_libs/User"
 	"git.baozhida.cn/ERP_libs/lib"
 	"github.com/beego/beego/v2/adapter/orm"
@@ -17,6 +19,7 @@ import (
 	"github.com/robfig/cron/v3"
 	"github.com/xuri/excelize/v2"
 	"math"
+	"os"
 	"strconv"
 	"strings"
 	"time"
@@ -31,6 +34,35 @@ func (c *StockController) Prepare() {
 	c.User = *Account.User_r
 }
 
+func (c *StockController) Device_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_state, _ := c.GetInt("T_state")
+	T_name := c.GetString("T_name")
+
+	DeviceDao := Stock.NewDevice(orm.NewOrm())
+	R_List, R_cnt := DeviceDao.Read_Device_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 (c *StockController) Stock_List() {
 
 	// 分页参数 初始化
@@ -210,18 +242,18 @@ func (c *StockController) Stock_Detail_Excel() {
 	}
 	var url string
 	//// 上传 OSS
-	//nats := natslibs.NewNats(Nats.Nats)
-	//url, is := nats.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/ofile/"+filename+".xlsx", "ofile/"+filename+".xlsx")
-	//if !is {
-	//	c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
-	//	c.ServeJSON()
-	//	return
-	//}
-	////删除目录
-	//err := os.Remove("ofile/" + filename + ".xlsx")
-	//if err != nil {
-	//	logs.Error(lib.FuncName(), err)
-	//}
+	nats := natslibs.NewNats(Nats.Nats)
+	url, is := nats.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/ofile/"+filename+".xlsx", "ofile/"+filename+".xlsx")
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
+		c.ServeJSON()
+		return
+	}
+	//删除目录
+	err := os.Remove("ofile/" + filename + ".xlsx")
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
 	c.ServeJSON()
@@ -560,19 +592,19 @@ func (c *StockController) StockOut_Add() {
 	ContractDao := Contract.NewContract(o)
 	ContractProductDao := Contract.NewContractProduct(o)
 
-	contract, _ := ContractDao.Read_Contract_ByT_number(T_contract_number)
-	if contract.Id == 0 {
+	_, err := StockOutDao.Add_StockOut(var_)
+	if err != nil {
 		o.Rollback()
-		c.Data["json"] = lib.JSONS{Code: 203, Msg: "合同编号错误!"}
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "出库失败"}
 		c.ServeJSON()
 		return
 	}
 
 	// 1、添加出库单
-	_, err := StockOutDao.Add_StockOut(var_)
-	if err != nil {
+	contract, _ := ContractDao.Read_Contract_ByT_number(T_contract_number)
+	if contract.Id == 0 && T_type == 2 {
 		o.Rollback()
-		c.Data["json"] = lib.JSONS{Code: 203, Msg: "出库失败"}
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "合同编号错误!"}
 		c.ServeJSON()
 		return
 	}
@@ -604,12 +636,13 @@ func (c *StockController) StockOut_Add() {
 			for _, sn := range snList {
 				mqtt := Stock.Read_MqttUser(sn)
 				device := Stock.Device{
-					T_product_id: product_id,
-					T_out_number: T_number,
-					T_sn:         sn,
-					T_iccid:      mqtt.Iccid,
-					T_imei:       mqtt.Imei,
-					T_State:      1,
+					T_contract_number: T_contract_number,
+					T_product_id:      product_id,
+					T_out_number:      T_number,
+					T_sn:              sn,
+					T_iccid:           mqtt.Iccid,
+					T_imei:            mqtt.Imei,
+					T_State:           1,
 				}
 				_, err = DeviceDao.AddOrUpdate_Device(device, 1)
 				if err != nil {

+ 38 - 0
controllers/power.go

@@ -0,0 +1,38 @@
+package controllers
+
+import (
+	"ERP_storage/Nats/NatsServer"
+	powerlibs "git.baozhida.cn/ERP_libs/Power"
+	"github.com/beego/beego/v2/adapter/orm"
+)
+
+// 检查角色是否与User一致,不存在则添加
+func CheckPowerUniformity() {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+
+	powerDao := powerlibs.NewPower(o)
+	userPowerList, _ := NatsServer.Read_Power_List_All()
+	powerList, _ := powerDao.Read_Power_List("", 0, 9999)
+	if len(userPowerList) == len(powerList) {
+		return
+	}
+	powerMap := make(map[string]string)
+	for _, r := range powerList {
+		powerMap[r.T_id] = r.T_name
+	}
+	for _, r := range userPowerList {
+		_, ok := powerMap[r.T_id]
+		if !ok {
+			p := powerlibs.Power{
+				T_id:   r.T_id,
+				T_name: r.T_name,
+			}
+			if r.T_menu == "*" {
+				p.T_menu = "*"
+			}
+			powerDao.Add_Power(p)
+		}
+	}
+}

+ 13 - 11
main.go

@@ -69,8 +69,9 @@ func main() {
 	beego.BConfig.RecoverPanic = true
 	beego.BConfig.RecoverFunc = RecoverPanic
 
-	go Basic.Read_ProductClass_All_Map() // 初始化产品类型
-	go controllers.Cron_StockMonth()     // 库存明细详情定时任务
+	go Basic.Read_ProductClass_All_Map()  // 初始化产品类型
+	go controllers.Cron_StockMonth()      // 库存明细详情定时任务
+	go controllers.CheckPowerUniformity() // 检查角色是否与用户系统一致,不存在则添加
 	beego.Run()
 
 }
@@ -89,15 +90,16 @@ func RecoverPanic(ctx *context.Context, config *beego.Config) {
 		}
 		//显示错误
 		data := map[string]interface{}{
-			"ret":           4000,
-			"AppError":      fmt.Sprintf("%v", err),
-			"RequestMethod": ctx.Input.Method(),
-			"RequestURL":    ctx.Input.URI(),
-			"RemoteAddr":    ctx.Input.IP(),
-			"Stack":         stack,
-			"GoVersion":     runtime.Version(),
-			"Code":          500,
-			"Msg":           "请稍后重试!",
+			"AppError": fmt.Sprintf("%v", err),
+			"Code":     500,
+			"Msg":      "请稍后重试!",
+		}
+		if conf.RunMode == "dev" {
+			data["RequestMethod"] = ctx.Input.Method()
+			data["RequestURL"] = ctx.Input.URI()
+			data["RemoteAddr"] = ctx.Input.IP()
+			data["Stack"] = stack
+			data["GoVersion"] = runtime.Version()
 		}
 		_ = ctx.Output.JSON(data, true, true)
 		//if ctx.Output.Status != 0 {

+ 2 - 3
models/Contract/Contract.go

@@ -76,7 +76,7 @@ type Contract_Detail struct {
 	T_submit_name   string
 	T_approver      string // 审批人uuid
 	T_approver_name string // 审批人名称
-	T_out           int
+	T_out           int    // 出库状态  1-未出库 2-已部分出库 3-已全部出库
 	T_State         int
 	T_remark        string
 	T_pdf           string
@@ -217,7 +217,7 @@ func (dao *ContractDaoImpl) Read_Contract_List(T_submit, T_name string, T_state,
 	}
 
 	if len(T_name) > 0 {
-		cond1 = cond1.AndCond(cond.Or("T_number__icontains", T_name).Or("T_sn__icontains", T_name))
+		cond1 = cond1.AndCond(cond.Or("T_number__icontains", T_name).Or("T_customer__icontains", T_name))
 	}
 
 	if len(T_submit) > 0 {
@@ -227,7 +227,6 @@ func (dao *ContractDaoImpl) Read_Contract_List(T_submit, T_name string, T_state,
 	// T_out == 1 查询未出库或部分出库数据
 	if T_out == 1 {
 		cond1 = cond1.AndNot("T_out", 3)
-
 	}
 
 	// 查询

+ 3 - 1
models/Contract/ContractProduct.go

@@ -66,7 +66,7 @@ type ContractProduct_Out struct {
 	T_stock_total     int    // 库存总数量
 	T_product_total   int    // 产品总数量
 	T_product_out     int    // 产品已出库数量
-	T_State           int
+	T_State           int    // 1-未出库 2-已部分出库 3-已全部出库
 
 	// ---------产品信息-----------
 	T_product_id          int    // 产品id
@@ -92,6 +92,7 @@ func ContractProductToContractProduct_R(t ContractProduct) (r ContractProduct_R)
 	r.T_product_class_name = Basic.Read_ProductClass_Get(product.T_class)
 	r.T_product_model = product.T_model
 	r.T_product_spec = product.T_spec
+	r.T_product_relation_sn = product.T_relation_sn
 	r.T_product_img = product.T_img
 	return r
 }
@@ -108,6 +109,7 @@ func ContractProductToContractProduct_Out(t ContractProduct) (r ContractProduct_
 	r.T_product_class_name = Basic.Read_ProductClass_Get(product.T_class)
 	r.T_product_model = product.T_model
 	r.T_product_spec = product.T_spec
+	r.T_product_relation_sn = product.T_relation_sn
 	r.T_product_img = product.T_img
 	return r
 }

+ 57 - 3
models/Stock/Device.go

@@ -2,6 +2,7 @@ package Stock
 
 import (
 	"ERP_storage/logs"
+	"ERP_storage/models/Basic"
 	"fmt"
 	"git.baozhida.cn/ERP_libs/lib"
 	_ "github.com/astaxie/beego/cache/redis"
@@ -45,13 +46,20 @@ func init() {
 type Device_R struct {
 	Id                int
 	T_contract_number string // 合同编号
-	T_product_id      int    // 产品id
 	T_in_number       string // 入库编号
 	T_out_number      string // 出库编号
 	T_sn              string // 设备sn
-	T_iccid           string
-	T_imei            string // 物联网卡号
+	T_iccid           string // 物联网卡号
+	T_imei            string // 模组imei
 	T_State           int    // 1-已出库 2-未出库
+
+	// ---------产品信息-----------
+	T_product_id         int
+	T_product_name       string
+	T_product_class_name string
+	T_product_model      string
+	T_product_spec       string
+	T_product_img        string
 }
 
 func DeviceToDevice_R(t Device) (r Device_R) {
@@ -64,6 +72,14 @@ func DeviceToDevice_R(t Device) (r Device_R) {
 	r.T_iccid = t.T_iccid
 	r.T_imei = t.T_imei
 	r.T_State = t.T_State
+
+	r.T_product_id = t.T_product_id
+	product, _ := Basic.Read_Product_ById(t.T_product_id)
+	r.T_product_name = product.T_name
+	r.T_product_class_name = Basic.Read_ProductClass_Get(product.T_class)
+	r.T_product_model = product.T_model
+	r.T_product_spec = product.T_spec
+	r.T_product_img = product.T_img
 	return r
 }
 
@@ -152,3 +168,41 @@ func (dao *DeviceDaoImpl) Read_DeviceSn_List(T_contract_number string, T_product
 
 	return
 }
+
+func (dao *DeviceDaoImpl) Read_Device_List(T_name string, T_State, page, page_z int) (r []Device_R, cnt int64) {
+	qs := dao.orm.QueryTable(new(Device))
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+	// 过滤
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_State__gt", 0)
+	if len(T_name) > 0 {
+		cond1 = cond1.AndCond(cond.Or("T_contract_number__icontains", T_name).Or("T_out_number__icontains", T_name).Or("T_sn__icontains", T_name))
+	}
+
+	if T_State > 0 {
+		cond = cond.And("T_State", T_State)
+	}
+
+	var maps []Device
+	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond)).All(&maps)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	cnt, err = qs.SetCond((*orm2.Condition)(cond)).Count()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	for _, v := range maps {
+		r = append(r, DeviceToDevice_R(v))
+	}
+
+	return
+}

+ 1 - 0
models/Stock/Stock.go

@@ -79,6 +79,7 @@ func StockToStock_R(t Stock) (r Stock_R) {
 	r.T_product_class_name = Basic.Read_ProductClass_Get(product.T_class)
 	r.T_product_model = product.T_model
 	r.T_product_spec = product.T_spec
+	r.T_product_relation_sn = product.T_relation_sn
 	r.T_product_img = product.T_img
 	return r
 }

+ 1 - 0
models/Stock/StockInProduct.go

@@ -77,6 +77,7 @@ func StockInProductToStockInProduct_R(t StockInProduct) (r StockInProduct_R) {
 	r.T_product_class_name = Basic.Read_ProductClass_Get(product.T_class)
 	r.T_product_model = product.T_model
 	r.T_product_spec = product.T_spec
+	r.T_product_relation_sn = product.T_relation_sn
 	r.T_product_img = product.T_img
 	return r
 }

+ 6 - 0
models/Stock/StockOut.go

@@ -114,6 +114,12 @@ func StockOutToStockOut_Detail(t StockOut, productList []StockOutProduct_R) (r S
 	r.T_receive = t.T_receive
 	r.T_receive_name = Account.Read_User_T_name_Get(t.T_receive)
 	r.T_remark = t.T_remark
+	r.T_delivery_type = t.T_delivery_type
+	r.T_signer_unit = t.T_signer_unit
+	r.T_signer = t.T_signer
+	r.T_signer_phone = t.T_signer_phone
+	r.T_signer_date = t.T_signer_date
+	r.T_courier_number = t.T_courier_number
 	r.T_Product = productList
 	return r
 }

+ 13 - 13
models/Stock/StockOutProduct.go

@@ -44,22 +44,21 @@ func init() {
 }
 
 type StockOutProduct_R struct {
-	Id         int
-	T_number   string // 入库单号
-	T_depot_id int    // 仓库id
-	T_num      int    // 入库数量
-	//T_relation_sn string // 关联sn,20220101,20230202,
-	T_date        string
+	Id            int
+	T_number      string   // 入库单号
+	T_depot_id    int      // 仓库id
+	T_num         int      // 入库数量
+	T_date        string   // 业务日期
 	T_device_list []string // sn关联列表
 
 	// ---------产品信息-----------
-	T_product_id          int
-	T_product_name        string
-	T_product_class_name  string
-	T_product_model       string
-	T_product_spec        string
-	T_product_relation_sn int
-	T_product_img         string
+	T_product_id          int    // 产品id
+	T_product_name        string // 产品名称
+	T_product_class_name  string // 产品分类名称
+	T_product_model       string // 产品型号
+	T_product_spec        string // 产品规格
+	T_product_relation_sn int    // 是否关联sn 0-否 1-是
+	T_product_img         string // 产品图片
 }
 
 func StockOutProductToStockOutProduct_R(t StockOutProduct) (r StockOutProduct_R) {
@@ -77,6 +76,7 @@ func StockOutProductToStockOutProduct_R(t StockOutProduct) (r StockOutProduct_R)
 	r.T_product_class_name = Basic.Read_ProductClass_Get(product.T_class)
 	r.T_product_model = product.T_model
 	r.T_product_spec = product.T_spec
+	r.T_product_relation_sn = product.T_relation_sn
 	r.T_product_img = product.T_img
 	return r
 }

+ 2 - 2
routers/Basic.go

@@ -16,8 +16,8 @@ func init() {
 
 	product := beego.NewNamespace("/Product",
 		beego.NSRouter("/List", &controllers.BasicController{}, "*:Product_List"), // 产品列表
-		beego.NSRouter("/Add", &controllers.BasicController{}, "*:Product_Add"),   // 获取产品
-		beego.NSRouter("/Edit", &controllers.BasicController{}, "*:Product_Edit"), // 添加产品
+		beego.NSRouter("/Add", &controllers.BasicController{}, "*:Product_Add"),   // 添加产品
+		beego.NSRouter("/Edit", &controllers.BasicController{}, "*:Product_Edit"), // 编辑产品
 		beego.NSRouter("/Del", &controllers.BasicController{}, "*:Product_Del"),   // 删除产品
 
 		beego.NSRouter("/Spec_List", &controllers.BasicController{}, "*:ProductSpec_List"),   // 产品规格

+ 1 - 0
routers/Contract.go

@@ -16,6 +16,7 @@ func init() {
 		beego.NSRouter("/Edit", &controllers.ContractController{}, "*:Contract_Edit"),                 // 编辑合同
 		beego.NSRouter("/Del", &controllers.ContractController{}, "*:Contract_Del"),                   // 删除合同
 		beego.NSRouter("/Product_List", &controllers.ContractController{}, "*:Contract_Product_List"), // 合同产品列表
+		beego.NSRouter("/Out_List", &controllers.ContractController{}, "*:Contract_List_For_Out"),     // 合同产品列表
 	)
 	beego.AddNamespace(contract)
 }

+ 4 - 1
routers/Stock.go

@@ -7,6 +7,9 @@ import (
 
 func init() {
 
+	device := beego.NewNamespace("/Device",
+		beego.NSRouter("/List", &controllers.StockController{}, "*:Device_List"), // 设备列表
+	)
 	stock := beego.NewNamespace("/Stock",
 		beego.NSRouter("/List", &controllers.StockController{}, "*:Stock_List"),                 // 库存列表
 		beego.NSRouter("/Detail_List", &controllers.StockController{}, "*:Stock_Detail_List"),   // 库存明细列表
@@ -23,5 +26,5 @@ func init() {
 		beego.NSRouter("/Add", &controllers.StockController{}, "*:StockOut_Add"),   // 出库
 		beego.NSRouter("/Edit", &controllers.StockController{}, "*:StockOut_Edit"), // 修改发货单
 	)
-	beego.AddNamespace(stock, stockIn, stockOut)
+	beego.AddNamespace(device, stock, stockIn, stockOut)
 }