IOTNetworkCard.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. package controllers
  2. import (
  3. "ERP_storage/Nats/NatsServer"
  4. "ERP_storage/conf"
  5. "ERP_storage/logs"
  6. "ERP_storage/models/Account"
  7. "ERP_storage/models/IOTNetworkCard"
  8. "encoding/json"
  9. "fmt"
  10. "github.com/beego/beego/v2/adapter/orm"
  11. beego "github.com/beego/beego/v2/server/web"
  12. "github.com/xuri/excelize/v2"
  13. userlibs "gogs.baozhida.cn/zoie/ERP_libs/User"
  14. "gogs.baozhida.cn/zoie/ERP_libs/lib"
  15. "math"
  16. "net/url"
  17. "os"
  18. "strconv"
  19. "time"
  20. )
  21. type IOTNetworkCardController struct {
  22. beego.Controller
  23. User userlibs.User
  24. }
  25. func (c *IOTNetworkCardController) Prepare() {
  26. c.User = *Account.User_r
  27. }
  28. // 财务管理列表
  29. func (c *IOTNetworkCardController) IOTNetworkCard_List() {
  30. // 分页参数 初始化
  31. page, _ := c.GetInt("page")
  32. if page < 1 {
  33. page = 1
  34. }
  35. page_z, _ := c.GetInt("page_z")
  36. if page_z < 1 {
  37. page_z = conf.Page_size
  38. }
  39. // 查询
  40. T_name := c.GetString("T_name")
  41. T_company_name := c.GetString("T_company_name")
  42. T_state, _ := c.GetInt("T_state")
  43. userList, _ := NatsServer.Read_User_List_All()
  44. Account.Read_User_All_Map(userList)
  45. IOTNetworkCardDao := IOTNetworkCard.NewIOTNetworkCard(orm.NewOrm())
  46. R_List, R_cnt := IOTNetworkCardDao.Read_IOTNetworkCard_List(T_name, T_company_name, T_state, page, page_z)
  47. var r_jsons lib.R_JSONS
  48. r_jsons.Num = R_cnt
  49. r_jsons.Data = R_List
  50. r_jsons.Page = page
  51. r_jsons.Page_size = int(math.Ceil(float64(R_cnt) / float64(page_z)))
  52. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  53. c.ServeJSON()
  54. return
  55. }
  56. func (c *IOTNetworkCardController) IOTNetworkCard_Get() {
  57. // 查询
  58. T_id, _ := c.GetInt("T_id")
  59. IOTNetworkCard_r, err := IOTNetworkCard.Read_IOTNetworkCard_ById(T_id)
  60. if err != nil {
  61. c.Data["json"] = lib.JSONS{Code: 203, Msg: "T_id Err!"}
  62. c.ServeJSON()
  63. return
  64. }
  65. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: IOTNetworkCard.IOTNetworkCardToIOTNetworkCard_R(IOTNetworkCard_r)}
  66. c.ServeJSON()
  67. return
  68. }
  69. func (c *IOTNetworkCardController) IOTNetworkCard_Add() {
  70. T_company_name := c.GetString("T_company_name")
  71. T_in_date := c.GetString("T_in_date")
  72. T_meal_type := c.GetString("T_meal_type")
  73. T_meal := c.GetString("T_meal")
  74. T_expire := c.GetString("T_expire")
  75. T_iccid := c.GetString("T_iccid")
  76. T_MSISDN := c.GetString("T_MSISDN")
  77. T_remark := c.GetString("T_remark")
  78. T_State, _ := c.GetInt("T_State")
  79. var_ := IOTNetworkCard.IOTNetworkCard{
  80. T_company_name: T_company_name,
  81. T_in_date: T_in_date,
  82. T_meal_type: T_meal_type,
  83. T_meal: T_meal,
  84. T_expire: T_expire,
  85. T_iccid: T_iccid,
  86. T_MSISDN: T_MSISDN,
  87. T_State: T_State,
  88. T_remark: T_remark,
  89. }
  90. // 添加入库记录
  91. var record []IOTNetworkCard.IOTNetworkCardRecord
  92. record = append(record, IOTNetworkCard.IOTNetworkCardRecord{
  93. T_data: time.Now().Format("2006-01-02"),
  94. T_State: T_State,
  95. })
  96. recordB, _ := json.Marshal(&record)
  97. var_.T_record = string(recordB)
  98. card, err := IOTNetworkCard.Read_IOTNetworkCard_ByT_iccid(T_iccid)
  99. if err != nil && err.Error() != orm.ErrNoRows.Error() {
  100. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败"}
  101. c.ServeJSON()
  102. return
  103. }
  104. if card.Id > 0 {
  105. c.Data["json"] = lib.JSONS{Code: 202, Msg: "此卡已入库"}
  106. c.ServeJSON()
  107. return
  108. }
  109. o := orm.NewOrm()
  110. IOTNetworkCardDao := IOTNetworkCard.NewIOTNetworkCard(o)
  111. Id, err := IOTNetworkCardDao.Add_IOTNetworkCard(var_)
  112. if err != nil {
  113. c.Data["json"] = lib.JSONS{Code: 203, Msg: "添加失败"}
  114. c.ServeJSON()
  115. return
  116. }
  117. NatsServer.AddUserLogs(c.User.T_uuid, "物联网卡", "添加", var_)
  118. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Id}
  119. c.ServeJSON()
  120. return
  121. }
  122. func (c *IOTNetworkCardController) IOTNetworkCard_Edit() {
  123. T_id, _ := c.GetInt("T_id")
  124. T_in_date := c.GetString("T_in_date")
  125. T_company_name := c.GetString("T_company_name")
  126. T_meal_type := c.GetString("T_meal_type")
  127. T_meal := c.GetString("T_meal")
  128. T_expire := c.GetString("T_expire")
  129. T_iccid := c.GetString("T_iccid")
  130. T_MSISDN := c.GetString("T_MSISDN")
  131. T_out_date := c.GetString("T_out_date") // 出库日期
  132. T_out_project := c.GetString("T_out_project") // 出库项目
  133. T_receive := c.GetString("T_receive") // 领用人
  134. T_State, _ := c.GetInt("T_State") // 状态
  135. T_remark := c.GetString("T_remark") // 状态
  136. IOTNetworkCard_r, err := IOTNetworkCard.Read_IOTNetworkCard_ById(T_id)
  137. if err != nil {
  138. c.Data["json"] = lib.JSONS{Code: 203, Msg: "T_id Err!"}
  139. c.ServeJSON()
  140. return
  141. }
  142. if len(T_in_date) > 0 {
  143. IOTNetworkCard_r.T_in_date = T_in_date
  144. }
  145. if len(T_company_name) > 0 {
  146. IOTNetworkCard_r.T_company_name = T_company_name
  147. }
  148. if len(T_meal_type) > 0 {
  149. IOTNetworkCard_r.T_meal_type = T_meal_type
  150. }
  151. if len(T_meal) > 0 {
  152. IOTNetworkCard_r.T_meal = T_meal
  153. }
  154. if len(T_expire) > 0 {
  155. IOTNetworkCard_r.T_expire = T_expire
  156. }
  157. if len(T_iccid) > 0 {
  158. IOTNetworkCard_r.T_iccid = T_iccid
  159. }
  160. if len(T_MSISDN) > 0 {
  161. IOTNetworkCard_r.T_MSISDN = T_MSISDN
  162. }
  163. if len(T_out_date) > 0 {
  164. IOTNetworkCard_r.T_out_date = T_out_date
  165. }
  166. if len(T_out_project) > 0 {
  167. IOTNetworkCard_r.T_out_project = T_out_project
  168. }
  169. if len(T_receive) > 0 {
  170. IOTNetworkCard_r.T_receive = T_receive
  171. }
  172. if len(T_remark) > 0 {
  173. IOTNetworkCard_r.T_remark = T_remark
  174. }
  175. if T_State > 0 && T_State != IOTNetworkCard_r.T_State {
  176. IOTNetworkCard_r.T_State = T_State
  177. // 添加入库记录
  178. var record []IOTNetworkCard.IOTNetworkCardRecord
  179. err = json.Unmarshal([]byte(IOTNetworkCard_r.T_record), &record)
  180. if err != nil {
  181. logs.Error("JSON 反序列化失败:", err)
  182. return
  183. }
  184. record = append(record, IOTNetworkCard.IOTNetworkCardRecord{
  185. T_data: time.Now().Format("2006-01-02"),
  186. T_State: T_State,
  187. T_out_project: T_out_project,
  188. T_remark: T_remark,
  189. })
  190. recordB, _ := json.Marshal(&record)
  191. IOTNetworkCard_r.T_record = string(recordB)
  192. }
  193. if T_State == IOTNetworkCard.IOTNetworkCardReturnIn {
  194. IOTNetworkCard_r.T_out_date = ""
  195. }
  196. o := orm.NewOrm()
  197. IOTNetworkCardDao := IOTNetworkCard.NewIOTNetworkCard(o)
  198. if err = IOTNetworkCardDao.Update_IOTNetworkCard(IOTNetworkCard_r,
  199. "T_in_date", "T_meal_type", "T_meal", "T_expire", "T_iccid", "T_MSISDN", "T_out_date", "T_out_project", "T_receive", "T_State", "T_record", "T_remark"); err != nil {
  200. c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
  201. c.ServeJSON()
  202. return
  203. }
  204. NatsServer.AddUserLogs(c.User.T_uuid, "物联网卡", "修改", IOTNetworkCard_r)
  205. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  206. c.ServeJSON()
  207. return
  208. }
  209. func (c *IOTNetworkCardController) IOTNetworkCard_Del() {
  210. T_id, _ := c.GetInt("T_id")
  211. IOTNetworkCard_r, err := IOTNetworkCard.Read_IOTNetworkCard_ById(T_id)
  212. if err != nil {
  213. c.Data["json"] = lib.JSONS{Code: 203, Msg: "T_id Err!"}
  214. c.ServeJSON()
  215. return
  216. }
  217. o := orm.NewOrm()
  218. IOTNetworkCardDao := IOTNetworkCard.NewIOTNetworkCard(o)
  219. err = IOTNetworkCardDao.Delete_IOTNetworkCard(IOTNetworkCard_r)
  220. if err != nil {
  221. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  222. c.ServeJSON()
  223. return
  224. }
  225. NatsServer.AddUserLogs(c.User.T_uuid, "物联网卡", "删除", strconv.Itoa(T_id))
  226. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_id}
  227. c.ServeJSON()
  228. return
  229. }
  230. // 导入
  231. func (c *IOTNetworkCardController) IOTNetworkCard_Import() {
  232. // 获取上传的文件
  233. f, _, err := c.GetFile("file")
  234. if err != nil {
  235. c.Data["json"] = lib.JSONS{Code: 1201, Msg: "读取文件失败!", Data: nil}
  236. c.ServeJSON()
  237. return
  238. }
  239. defer f.Close()
  240. // 读取 Excel 文件
  241. reader, err := excelize.OpenReader(f)
  242. if err != nil {
  243. c.Data["json"] = lib.JSONS{Code: 1201, Msg: "打开文件失败!", Data: nil}
  244. c.ServeJSON()
  245. return
  246. }
  247. defer func() {
  248. if err = reader.Close(); err != nil {
  249. c.Data["json"] = lib.JSONS{Code: 1201, Msg: "关闭文件失败!", Data: nil}
  250. c.ServeJSON()
  251. return
  252. }
  253. }()
  254. var IOTNetworkCardList []IOTNetworkCard.IOTNetworkCard
  255. sheetMap := reader.GetSheetMap()
  256. for _, sheetName := range sheetMap {
  257. //读取工作表中的数据
  258. rows, errs := reader.GetRows(sheetName)
  259. if errs != nil {
  260. c.Data["json"] = lib.JSONS{Code: 1201, Msg: "读取工作表失败!", Data: nil}
  261. c.ServeJSON()
  262. return
  263. }
  264. for i, row := range rows {
  265. if i < 2 {
  266. continue // 忽略第一行和第二行
  267. }
  268. if len(row) >= 6 {
  269. // 解析时间
  270. t, errT := time.Parse("01-02-06", row[1])
  271. if errT != nil {
  272. c.Data["json"] = lib.JSONS{Code: 203, Msg: "解析入库时间失败"}
  273. c.ServeJSON()
  274. return
  275. }
  276. T_MSISDN := row[6]
  277. //_, errGet := IOTNetworkCard.Read_IOTNetworkCard_ByT_iccid(T_MSISDN)
  278. //if errGet != nil && errGet.Error() != orm.ErrNoRows.Error() {
  279. // continue
  280. //}
  281. var_ := IOTNetworkCard.IOTNetworkCard{
  282. T_in_date: t.Format("2006-01-02"),
  283. T_company_name: row[0],
  284. T_meal_type: row[2],
  285. T_meal: row[3],
  286. T_expire: row[4],
  287. T_iccid: row[5],
  288. T_MSISDN: T_MSISDN,
  289. T_State: IOTNetworkCard.IOTNetworkCardNewCardIn,
  290. }
  291. // 添加入库记录
  292. var record []IOTNetworkCard.IOTNetworkCardRecord
  293. record = append(record, IOTNetworkCard.IOTNetworkCardRecord{
  294. T_data: time.Now().Format("2006-01-02"),
  295. T_State: IOTNetworkCard.IOTNetworkCardNewCardIn,
  296. })
  297. if len(row) >= 8 && len(row[7]) > 0 {
  298. var outTime string
  299. outT, errOutT := time.Parse("01-02-06", row[7])
  300. if errOutT != nil {
  301. c.Data["json"] = lib.JSONS{Code: 203, Msg: "解析出库时间失败"}
  302. c.ServeJSON()
  303. return
  304. }
  305. outTime = outT.Format("2006-01-02")
  306. var_.T_State = IOTNetworkCard.IOTNetworkCardOut
  307. var_.T_out_date = outTime
  308. var_.T_out_project = row[8]
  309. record = append(record, IOTNetworkCard.IOTNetworkCardRecord{
  310. T_data: time.Now().Format("2006-01-02"),
  311. T_State: IOTNetworkCard.IOTNetworkCardOut,
  312. T_out_project: row[8],
  313. })
  314. }
  315. recordB, _ := json.Marshal(&record)
  316. var_.T_record = string(recordB)
  317. IOTNetworkCardList = append(IOTNetworkCardList, var_)
  318. }
  319. }
  320. }
  321. o := orm.NewOrm()
  322. o.Begin()
  323. IOTNetworkCardDao := IOTNetworkCard.NewIOTNetworkCard(o)
  324. // 定义批次大小
  325. batchSize := 1000
  326. total := len(IOTNetworkCardList)
  327. for i := 0; i < total; i += batchSize {
  328. end := i + batchSize
  329. if end > total {
  330. end = total
  331. }
  332. batch := IOTNetworkCardList[i:end]
  333. // 执行数据库批量插入
  334. if _, err := IOTNetworkCardDao.Add_IOTNetworkCardMulti(batch); err != nil {
  335. o.Rollback()
  336. c.Data["json"] = lib.JSONS{Code: 203, Msg: "导入失败"}
  337. c.ServeJSON()
  338. return // 中断处理流程
  339. }
  340. }
  341. o.Commit()
  342. // 去重 保留最小值
  343. IOTNetworkCardDao.DeleteDeduplicate()
  344. c.Data["json"] = lib.JSONS{Code: 200, Msg: "成功!", Data: nil}
  345. c.ServeJSON()
  346. }
  347. // 修改移动端设备编号
  348. func (c *IOTNetworkCardController) IOTNetworkCard_Edit_Device_Number() {
  349. T_id, _ := c.GetInt("T_id")
  350. T_device_number := c.GetString("T_device_number")
  351. IOTNetworkCard_r, err := IOTNetworkCard.Read_IOTNetworkCard_ById(T_id)
  352. if err != nil {
  353. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
  354. c.ServeJSON()
  355. return
  356. }
  357. IOTNetworkCard_r.T_device_number = T_device_number
  358. o := orm.NewOrm()
  359. IOTNetworkCardDao := IOTNetworkCard.NewIOTNetworkCard(o)
  360. if err = IOTNetworkCardDao.Update_IOTNetworkCard(IOTNetworkCard_r, "T_device_number"); err != nil {
  361. c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
  362. c.ServeJSON()
  363. return
  364. }
  365. NatsServer.AddUserLogs(c.User.T_uuid, "物联网卡", "修改移动端设备编号", IOTNetworkCard_r)
  366. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  367. c.ServeJSON()
  368. return
  369. }
  370. // 导出
  371. func (c *IOTNetworkCardController) IOTNetworkCard_Export() {
  372. // 分页参数 初始化
  373. // 查询
  374. T_name := c.GetString("T_name")
  375. T_company_name := c.GetString("T_company_name")
  376. T_state, _ := c.GetInt("T_state")
  377. userList, _ := NatsServer.Read_User_List_All()
  378. Account.Read_User_All_Map(userList)
  379. IOTNetworkCardDao := IOTNetworkCard.NewIOTNetworkCard(orm.NewOrm())
  380. R_List, _ := IOTNetworkCardDao.Read_IOTNetworkCard_List(T_name, T_company_name, T_state, 0, 9999)
  381. f := excelize.NewFile() //设置单元格值
  382. // 这里设置表头ÒÒ
  383. Style1, _ := f.NewStyle(
  384. &excelize.Style{
  385. Font: &excelize.Font{Size: 20, Family: "宋体"},
  386. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
  387. })
  388. Style2, _ := f.NewStyle(
  389. &excelize.Style{
  390. Font: &excelize.Font{Size: 15, Family: "宋体"},
  391. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  392. Border: []excelize.Border{
  393. {Type: "left", Color: "000000", Style: 1},
  394. {Type: "top", Color: "000000", Style: 1},
  395. {Type: "bottom", Color: "000000", Style: 1},
  396. {Type: "right", Color: "000000", Style: 1},
  397. },
  398. Fill: excelize.Fill{Type: "pattern", Color: []string{"D9D9D9"}, Pattern: 1},
  399. })
  400. Style3, _ := f.NewStyle(
  401. &excelize.Style{
  402. Font: &excelize.Font{Size: 15, Family: "宋体"},
  403. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  404. Border: []excelize.Border{
  405. {Type: "left", Color: "000000", Style: 1},
  406. {Type: "top", Color: "000000", Style: 1},
  407. {Type: "bottom", Color: "000000", Style: 1},
  408. {Type: "right", Color: "000000", Style: 1},
  409. },
  410. })
  411. f.MergeCell("Sheet1", "A1", "M1")
  412. f.SetCellValue("Sheet1", "A1", "物联网卡")
  413. f.SetCellStyle("Sheet1", "A1", "M1", Style1)
  414. // 写入表头
  415. headers := []string{"序号", "公司名称", "入库日期", "套餐类型", "套餐", "到期&欠费", "状态", "串码", "移动端设备编号", "MSISDN", "出库日期", "出库项目", "领用人"}
  416. for col, header := range headers {
  417. cell := fmt.Sprintf("%c%d", rune('A'+col), 2)
  418. f.SetCellValue("Sheet1", cell, header)
  419. }
  420. // 这里设置表头
  421. f.SetCellStyle("Sheet1", "A2", "M2", Style2)
  422. f.SetRowHeight("Sheet1", 2, 25)
  423. colsWidth := []float64{6, 40, 15, 12, 12, 25, 12, 30, 17, 17, 15, 30, 15}
  424. for col, width := range colsWidth {
  425. cell := fmt.Sprintf("%c", rune('A'+col))
  426. f.SetColWidth("Sheet1", cell, cell, width)
  427. }
  428. line := 2
  429. for i, v := range R_List {
  430. // 写入数据
  431. line++
  432. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), i+1)
  433. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.T_company_name)
  434. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.T_in_date)
  435. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.T_meal_type)
  436. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.T_meal)
  437. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.T_expire)
  438. var t_state string
  439. switch v.T_State {
  440. case 1:
  441. t_state = "新卡入库"
  442. case 2:
  443. t_state = "退还入库"
  444. case 3:
  445. t_state = "已出库"
  446. case 4:
  447. t_state = "损坏退还"
  448. case 5:
  449. t_state = "待注销"
  450. case 6:
  451. t_state = "已注销"
  452. }
  453. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), t_state)
  454. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.T_iccid)
  455. f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), v.T_device_number)
  456. f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), v.T_MSISDN)
  457. f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), v.T_out_date)
  458. f.SetCellValue("Sheet1", fmt.Sprintf("L%d", line), v.T_out_project)
  459. f.SetCellValue("Sheet1", fmt.Sprintf("M%d", line), v.T_receive_name)
  460. }
  461. f.SetCellStyle("Sheet1", "A3", fmt.Sprintf("M%d", line), Style3)
  462. timeStr := time.Now().Format("20060102150405")
  463. fileName := fmt.Sprintf("物联网卡%v.xlsx", timeStr)
  464. filePath := "ofile/" + fileName
  465. // 保存文件
  466. if err := f.SaveAs(filePath); err != nil {
  467. logs.Error("保存文件失败:", err)
  468. }
  469. defer func() {
  470. os.Remove(filePath)
  471. }()
  472. c.Ctx.Output.Header("Content-Type", "application/vnd.ms-excel;charset=utf8")
  473. c.Ctx.Output.Header("Content-Disposition", "attachment; filename="+url.PathEscape(fileName))
  474. c.Ctx.Output.Header("Content-Transfer-Encoding", "binary")
  475. c.Ctx.Output.Download(filePath, fileName)
  476. }