contract_service.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. /*
  2. * @description: 合同数据相关操作
  3. * @Author: CP
  4. * @Date: 2020-10-27 11:28:24
  5. * @FilePath: \construction_management\services\contract_service.go
  6. */
  7. package services
  8. import (
  9. "errors"
  10. "fmt"
  11. "html"
  12. "log"
  13. "strconv"
  14. "time"
  15. "github.com/kataras/iris/v12"
  16. "go.mod/comm"
  17. "go.mod/conf"
  18. "go.mod/dao"
  19. "go.mod/datasource"
  20. "go.mod/models"
  21. "go.mod/web/viewmodels"
  22. )
  23. //定义项目用户Service接口
  24. type ContractService interface {
  25. ValidRuleDepth(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  26. ValidRuleTemplate(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  27. ValidRuleSectionAdd(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  28. ValidRuleSectionDelete(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  29. ValidRuleGet(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  30. ValidRuleSerial(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  31. ValidRuleContractAdd(ctx iris.Context) (*viewmodels.Contracts, error)
  32. ValidRuleContractEdi(ctx iris.Context) (*viewmodels.Contracts, error)
  33. ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error)
  34. Get(treeId int, bidsectionId int, projectId int) *viewmodels.TreeSectionContract
  35. GetSectionTreeContract(attribution string, bidsectionId int, projectId int) []*viewmodels.Contracts
  36. GetSecionTree(bidsectionId int, projectId int) *viewmodels.TreeSectionContract
  37. SetSection(templateNumber int, bidsectionId int, projectIdInt int) error
  38. SectionAdd(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int) error
  39. SectionSave(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int) error
  40. UpdateSerial(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int) error
  41. SectionDelete(treeId int, bidsectionId int, projectId int) error
  42. MoveDepth(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int) error
  43. MoveSerial(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int) error
  44. GetContract(contractId int) *viewmodels.Contracts
  45. Add(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  46. Update(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  47. Delete(projectId int, bidsectionId int, treeId int, id int) error
  48. Close(projectId int, bidsectionId int, treeId int, id int) error
  49. Unlock(projectId int, bidsectionId int, treeId int, id int) error
  50. }
  51. //返回service操作类
  52. type contractService struct {
  53. treeContractDao *dao.TreeContractDao
  54. contractDao *dao.ContractDao
  55. treeDao *dao.TreeDao
  56. }
  57. //创建项目用户service
  58. func NewContractService() ContractService {
  59. return &contractService{
  60. treeContractDao: dao.NewTreeContractDao(datasource.InstanceDbMaster()),
  61. contractDao: dao.NewContractDao(datasource.InstanceDbMaster()),
  62. treeDao: dao.NewTreeDao(datasource.InstanceDbMaster()),
  63. }
  64. }
  65. // 升级降级规则验证
  66. func (s *contractService) ValidRuleDepth(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  67. treeSectionVaild := &viewmodels.TreeSectionContract{}
  68. err := ctx.ReadJSON(treeSectionVaild)
  69. if err != nil {
  70. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  71. return treeSectionVaild, err
  72. }
  73. err = treeSectionVaild.ValidateDepth()
  74. if err != nil {
  75. log.Println("参数验证错误, error=", err)
  76. return treeSectionVaild, err
  77. }
  78. return treeSectionVaild, nil
  79. }
  80. // 模板规则验证
  81. func (s *contractService) ValidRuleTemplate(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  82. treeSectionVaild := &viewmodels.TreeSectionContract{}
  83. err := ctx.ReadJSON(treeSectionVaild)
  84. if err != nil {
  85. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  86. return treeSectionVaild, err
  87. }
  88. err = treeSectionVaild.ValidateTemplate()
  89. if err != nil {
  90. log.Println("参数验证错误, error=", err)
  91. return treeSectionVaild, err
  92. }
  93. return treeSectionVaild, nil
  94. }
  95. // 模板规则新增项目节
  96. func (s *contractService) ValidRuleSectionAdd(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  97. treeSectionVaild := &viewmodels.TreeSectionContract{}
  98. err := ctx.ReadJSON(treeSectionVaild)
  99. if err != nil {
  100. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  101. return treeSectionVaild, err
  102. }
  103. err = treeSectionVaild.ValidateSectionAdd()
  104. if err != nil {
  105. log.Println("参数验证错误, error=", err)
  106. return treeSectionVaild, err
  107. }
  108. return treeSectionVaild, nil
  109. }
  110. // 模板规则新增项目节
  111. func (s *contractService) ValidRuleSectionDelete(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  112. treeSectionVaild := &viewmodels.TreeSectionContract{}
  113. err := ctx.ReadForm(treeSectionVaild)
  114. if err != nil {
  115. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  116. return treeSectionVaild, err
  117. }
  118. err = treeSectionVaild.ValidateSectionDelete()
  119. if err != nil {
  120. log.Println("参数验证错误, error=", err)
  121. return treeSectionVaild, err
  122. }
  123. return treeSectionVaild, nil
  124. }
  125. func (s *contractService) ValidRuleGet(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  126. treeSectionVaild := &viewmodels.TreeSectionContract{}
  127. err := ctx.ReadForm(treeSectionVaild)
  128. if err != nil {
  129. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  130. return treeSectionVaild, err
  131. }
  132. err = treeSectionVaild.ValidateSectionDelete()
  133. if err != nil {
  134. log.Println("参数验证错误, error=", err)
  135. return treeSectionVaild, err
  136. }
  137. return treeSectionVaild, nil
  138. }
  139. // 验证序号相关
  140. func (s *contractService) ValidRuleSerial(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  141. treeSectionVaild := &viewmodels.TreeSectionContract{}
  142. err := ctx.ReadForm(treeSectionVaild)
  143. if err != nil {
  144. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  145. return treeSectionVaild, err
  146. }
  147. err = treeSectionVaild.ValidateSectionSerial()
  148. if err != nil {
  149. log.Println("参数验证错误, error=", err)
  150. return treeSectionVaild, err
  151. }
  152. return treeSectionVaild, nil
  153. }
  154. // 新增合同参数验证
  155. func (s *contractService) ValidRuleContractAdd(ctx iris.Context) (*viewmodels.Contracts, error) {
  156. // 创建一个存放前端传过来参数
  157. contractsVaild := &viewmodels.Contracts{}
  158. // 存放raw的值,放入到contractsVaild
  159. err := ctx.ReadJSON(contractsVaild)
  160. if err != nil {
  161. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  162. return contractsVaild, err
  163. }
  164. // 验证合同传参
  165. err = contractsVaild.ValidateAdd()
  166. if err != nil {
  167. log.Println("参数验证错误, error=", err)
  168. return contractsVaild, err
  169. }
  170. // xss
  171. contractsVaild.Code = html.EscapeString(contractsVaild.Code)
  172. contractsVaild.Name = html.EscapeString(contractsVaild.Name)
  173. contractsVaild.Price = html.EscapeString(contractsVaild.Price)
  174. return contractsVaild, nil
  175. }
  176. // 校验编辑接口
  177. func (s *contractService) ValidRuleContractEdi(ctx iris.Context) (*viewmodels.Contracts, error) {
  178. // 创建一个存放前端传过来参数
  179. contractsVaild := &viewmodels.Contracts{}
  180. // 存放raw的值,放入到contractsVaild
  181. err := ctx.ReadJSON(contractsVaild)
  182. if err != nil {
  183. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  184. return contractsVaild, err
  185. }
  186. // 验证合同传参
  187. err = contractsVaild.ValidateEdi()
  188. if err != nil {
  189. log.Println("参数验证错误, error=", err)
  190. return contractsVaild, err
  191. }
  192. contractsVaild.Content = html.EscapeString(contractsVaild.Content)
  193. contractsVaild.Name = html.EscapeString(contractsVaild.Name)
  194. contractsVaild.Price = html.EscapeString(contractsVaild.Price)
  195. contractsVaild.PartyA = html.EscapeString(contractsVaild.PartyA)
  196. contractsVaild.PartyASigner = html.EscapeString(contractsVaild.PartyASigner)
  197. contractsVaild.PartyB = html.EscapeString(contractsVaild.PartyB)
  198. contractsVaild.PartyBSigner = html.EscapeString(contractsVaild.PartyBSigner)
  199. return contractsVaild, nil
  200. }
  201. func (s *contractService) ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error) {
  202. // 创建一个存放前端传过来参数
  203. contractsVaild := &viewmodels.Contracts{}
  204. // 存放raw的值,放入到contractsVaild
  205. err := ctx.ReadJSON(contractsVaild)
  206. if err != nil {
  207. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  208. return contractsVaild, err
  209. }
  210. // 验证合同传参
  211. err = contractsVaild.ValidateDel()
  212. if err != nil {
  213. log.Println("参数验证错误, error=", err)
  214. return contractsVaild, err
  215. }
  216. return contractsVaild, nil
  217. }
  218. // 获得项目节
  219. func (s *contractService) Get(treeId int, bidsectionId int, projectId int) *viewmodels.TreeSectionContract {
  220. // 1.获得项目节
  221. section := s.treeContractDao.Get(treeId, bidsectionId, projectId)
  222. // 2.构造数据
  223. sectionVM := s.makeSectionView(section)
  224. return sectionVM
  225. }
  226. // 获得合同详情
  227. func (s *contractService) GetContract(contractId int) *viewmodels.Contracts {
  228. contract := s.contractDao.Get(contractId)
  229. contractsVM := &viewmodels.Contracts{}
  230. id, _ := comm.AesEncrypt(strconv.Itoa(contract.Id), conf.SignSecret)
  231. treeId, _ := comm.AesEncrypt(strconv.Itoa(contract.TreeId), conf.SignSecret)
  232. bidsectionId, _ := comm.AesEncrypt(strconv.Itoa(contract.BidsectionId), conf.SignSecret)
  233. contractsVM.Id = id
  234. contractsVM.TreeId = treeId
  235. contractsVM.ContractsType = contract.ContractsType
  236. contractsVM.BidsectionId = bidsectionId
  237. contractsVM.Name = contract.Name
  238. contractsVM.Content = contract.Content
  239. contractsVM.Code = contract.Code
  240. contractsVM.PartyA = contract.PartyA
  241. contractsVM.PartyASigner = contract.PartyASigner
  242. contractsVM.PartyB = contract.PartyB
  243. contractsVM.PartyBSigner = contract.PartyBSigner
  244. contractsVM.Remarks = contract.Remarks
  245. contractsVM.Price = contract.Price
  246. contractsVM.Returned = contract.Returned
  247. contractsVM.Paid = contract.Paid
  248. contractsVM.Status = contract.Status
  249. contractsVM.CreateTime = contract.CreateTime.Format(conf.SysTimeform)
  250. contractsVM.UpdateTime = contract.UpdateTime.Format(conf.SysTimeform)
  251. contractsVM.SignerTime = contract.SignerTime.Format(conf.SysTimeform)
  252. return contractsVM
  253. }
  254. // 新增合同
  255. func (s *contractService) Add(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error {
  256. // 1. 项目节存在
  257. contracts := s.treeContractDao.Get(treeId, bidsectionId, projectId)
  258. if contracts.Id == 0 {
  259. return errors.New("未找到项目节")
  260. }
  261. // k := int32(projectId)
  262. // 2.项目节是没有合同
  263. if contracts.ContractId != 0 {
  264. return errors.New("该项目节上已经存在合同")
  265. }
  266. // 3.新增合同 --合计标段上的金额
  267. contractsCm := &models.CmContracts{}
  268. contractsCm.Code = contractData.Code
  269. contractsCm.Name = contractData.Name
  270. contractsCm.ContractsType = contractData.ContractsType
  271. contractsCm.Price = contractData.Price
  272. contractsCm.Returned = "0"
  273. contractsCm.Paid = "0"
  274. contractsCm.TreeId = treeId
  275. contractsCm.ProjectId = projectId
  276. contractsCm.BidsectionId = bidsectionId
  277. contractsCm.Status = 0
  278. contractsCm.CreateTime = time.Now()
  279. contractsCm.UpdateTime = time.Now()
  280. err := s.contractDao.Add(contractsCm)
  281. if err != nil {
  282. return err
  283. }
  284. // 3.获得该标段下合同总数 - 总收入金额
  285. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId)
  286. // 更新标段目录上合同金额和总数
  287. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  288. if err != nil {
  289. return err
  290. }
  291. return nil
  292. }
  293. // 更新合同
  294. func (s *contractService) Update(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error {
  295. // 1. 项目节存在
  296. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId)
  297. if contractsTree.Id == 0 {
  298. return errors.New("未找到项目节")
  299. }
  300. // 2.项目节是没有合同
  301. if contractsTree.ContractId == 0 {
  302. return errors.New("该项目节上没有找到合同")
  303. }
  304. contractsCm := &models.CmContracts{}
  305. contractsCm.Id = contractsTree.ContractId
  306. contractsCm.Content = contractData.Content
  307. contractsCm.Name = contractData.Name
  308. contractsCm.Price = contractData.Price
  309. contractsCm.PartyA = contractData.PartyA
  310. contractsCm.PartyASigner = contractData.PartyASigner
  311. contractsCm.PartyB = contractData.PartyB
  312. contractsCm.PartyBSigner = contractData.PartyBSigner
  313. loc, _ := time.LoadLocation("Local")
  314. SignerTime, err := time.ParseInLocation(conf.SysTimeform, contractData.SignerTime, loc)
  315. if err != nil {
  316. return errors.New("签约时间填写异常")
  317. }
  318. contractsCm.SignerTime = SignerTime
  319. contractsCm.Remarks = contractData.Remarks
  320. columns := []string{"Content", "Name", "Price", "PartyA", "PartyASigner", "PartyB", "PartyBSigner"}
  321. err = s.contractDao.Update(contractsCm, columns, projectId, bidsectionId, treeId)
  322. if err != nil {
  323. return err
  324. }
  325. // 3.获得该标段下合同总数 - 总收入金额
  326. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId)
  327. // 更新标段目录上合同金额和总数
  328. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  329. if err != nil {
  330. return err
  331. }
  332. return nil
  333. }
  334. // 删除合同
  335. func (s *contractService) Delete(projectId int, bidsectionId int, treeId int, id int) error {
  336. // 1. 项目节存在
  337. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId)
  338. if contractsTree.Id == 0 {
  339. return errors.New("未找到项目节")
  340. }
  341. // 2.项目节是没有合同
  342. if contractsTree.ContractId == 0 {
  343. return errors.New("该项目节上没有找到合同")
  344. }
  345. // 删除合同
  346. err := s.contractDao.Delete(projectId, bidsectionId, treeId, id)
  347. if err != nil {
  348. return err
  349. }
  350. // 3.获得该标段下合同总数 - 总收入金额
  351. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId)
  352. // 更新标段目录上合同金额和总数
  353. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  354. if err != nil {
  355. return err
  356. }
  357. return nil
  358. }
  359. // 关闭合同
  360. func (s *contractService) Close(projectId int, bidsectionId int, treeId int, id int) error {
  361. // 1. 项目节存在
  362. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId)
  363. if contractsTree.Id == 0 {
  364. return errors.New("未找到项目节")
  365. }
  366. // 2.项目节是没有合同
  367. if contractsTree.ContractId == 0 {
  368. return errors.New("该项目节上没有找到合同")
  369. }
  370. // 删除合同
  371. err := s.contractDao.Close(projectId, bidsectionId, treeId, id)
  372. if err != nil {
  373. return err
  374. }
  375. return nil
  376. }
  377. // 解锁合同
  378. func (s *contractService) Unlock(projectId int, bidsectionId int, treeId int, id int) error {
  379. // 1. 项目节存在
  380. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId)
  381. if contractsTree.Id == 0 {
  382. return errors.New("未找到项目节")
  383. }
  384. // 2.项目节是没有合同
  385. if contractsTree.ContractId == 0 {
  386. return errors.New("该项目节上没有找到合同")
  387. }
  388. // 删除合同
  389. err := s.contractDao.Unlock(projectId, bidsectionId, treeId, id)
  390. if err != nil {
  391. return err
  392. }
  393. return nil
  394. }
  395. // 获得合同总数量和总金额
  396. func (s *contractService) getContractTotalAndPrice(bidsectionId int, projectId int) (contractTotal int, priceTotal float64) {
  397. contractList := s.treeContractDao.GetContract(bidsectionId, projectId)
  398. priceTotal = 0.00
  399. for _, item := range contractList {
  400. contractPrice, _ := strconv.ParseFloat(item.ContractPrice, 64)
  401. priceTotal = priceTotal + contractPrice
  402. }
  403. // 合同总数
  404. // contractTotal = len(contractList) + 1
  405. contractTotal = len(contractList)
  406. // 合同收入总金额
  407. // price, _ := strconv.ParseFloat(priceString, 64)
  408. // priceTotal = priceTotal + price
  409. // 保留2位小数
  410. priceTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", priceTotal), 64)
  411. return contractTotal, priceTotal
  412. }