contract_service.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  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. ValidRuleContractRetrunAdd(ctx iris.Context) (*viewmodels.ContractsReturn, error)
  35. ValidRuleContractRetrun(ctx iris.Context) (*viewmodels.ContractsReturn, error)
  36. ValidRuleContractRetrunDel(ctx iris.Context) (*viewmodels.ContractsReturn, error)
  37. ValidRuleContractPaidAdd(ctx iris.Context) (*viewmodels.ContractsPaid, error)
  38. ValidRuleContractPaid(ctx iris.Context) (*viewmodels.ContractsPaid, error)
  39. ValidRuleContractPaidDel(ctx iris.Context) (*viewmodels.ContractsPaid, error)
  40. Get(treeId int, bidsectionId int, projectId int, treeType int) *viewmodels.TreeSectionContract
  41. GetSectionTreeContract(attribution string, bidsectionId int, projectId int, treeType int) []*viewmodels.Contracts
  42. GetSecionTree(bidsectionId int, projectId int, treeType int) *viewmodels.TreeSectionContract
  43. SetSection(templateNumber int, bidsectionId int, projectIdInt int, treeType int) error
  44. SectionAdd(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
  45. SectionSave(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
  46. UpdateSerial(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
  47. SectionDelete(treeId int, bidsectionId int, projectId int, treeType int) error
  48. MoveDepth(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
  49. MoveSerial(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
  50. GetContract(contractId int) *viewmodels.Contracts
  51. Add(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  52. Update(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  53. Delete(projectId int, bidsectionId int, treeId int, id int) error
  54. Close(projectId int, bidsectionId int, treeId int, id int) error
  55. Unlock(projectId int, bidsectionId int, treeId int, id int) error
  56. GetSurvey(bidsectionId int, projectId int, contractsType int) map[string]interface{}
  57. ReturnCreate(returnData *viewmodels.ContractsReturn, projectId int, bidsectionId int, contractsId int, projectAccountId int) error
  58. ReturnUpdate(returnData *viewmodels.ContractsReturn, projectId int, bidsectionId int, contractsId int, id int) error
  59. ReturnAll(projectId int, bidsectionId int, contractsId int, page int) []*viewmodels.ContractsReturn
  60. ReturnDelete(projectId int, bidsectionId int, contractsId int, id int) error
  61. //支出合同
  62. AddExpenditure(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  63. UpdateExpenditure(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  64. DeleteExpenditure(projectId int, bidsectionId int, treeId int, id int) error
  65. // 已支付
  66. PaidAll(projectId int, bidsectionId int, contractsId int, page int) []*viewmodels.ContractsPaid
  67. PaidCreate(returnData *viewmodels.ContractsPaid, projectId int, bidsectionId int, contractsId int, projectAccountId int) error
  68. PaidUpdate(returnData *viewmodels.ContractsPaid, projectId int, bidsectionId int, contractsId int, id int) error
  69. PaidDelete(projectId int, bidsectionId int, contractsId int, id int) error
  70. }
  71. //返回service操作类
  72. type contractService struct {
  73. treeContractDao *dao.TreeContractDao
  74. contractDao *dao.ContractDao
  75. contractReturnDao *dao.ContractReturnDao
  76. contractPaidDao *dao.ContractPaidDao
  77. treeDao *dao.TreeDao
  78. annexDao *dao.AnnexDao
  79. }
  80. //创建项目用户service
  81. func NewContractService() ContractService {
  82. return &contractService{
  83. treeContractDao: dao.NewTreeContractDao(datasource.InstanceDbMaster()),
  84. contractDao: dao.NewContractDao(datasource.InstanceDbMaster()),
  85. contractReturnDao: dao.NewContractReturnDao(datasource.InstanceDbMaster()),
  86. contractPaidDao: dao.NewContractPaidDao(datasource.InstanceDbMaster()),
  87. treeDao: dao.NewTreeDao(datasource.InstanceDbMaster()),
  88. annexDao: dao.NewAnnexDao(datasource.InstanceDbMaster()),
  89. }
  90. }
  91. // 升级降级规则验证
  92. func (s *contractService) ValidRuleDepth(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  93. treeSectionVaild := &viewmodels.TreeSectionContract{}
  94. err := ctx.ReadJSON(treeSectionVaild)
  95. if err != nil {
  96. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  97. return treeSectionVaild, err
  98. }
  99. err = treeSectionVaild.ValidateDepth()
  100. if err != nil {
  101. log.Println("参数验证错误, error=", err)
  102. return treeSectionVaild, err
  103. }
  104. return treeSectionVaild, nil
  105. }
  106. // 模板规则验证
  107. func (s *contractService) ValidRuleTemplate(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  108. treeSectionVaild := &viewmodels.TreeSectionContract{}
  109. err := ctx.ReadJSON(treeSectionVaild)
  110. if err != nil {
  111. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  112. return treeSectionVaild, err
  113. }
  114. err = treeSectionVaild.ValidateTemplate()
  115. if err != nil {
  116. log.Println("参数验证错误, error=", err)
  117. return treeSectionVaild, err
  118. }
  119. return treeSectionVaild, nil
  120. }
  121. // 模板规则新增项目节
  122. func (s *contractService) ValidRuleSectionAdd(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  123. treeSectionVaild := &viewmodels.TreeSectionContract{}
  124. err := ctx.ReadJSON(treeSectionVaild)
  125. if err != nil {
  126. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  127. return treeSectionVaild, err
  128. }
  129. err = treeSectionVaild.ValidateSectionAdd()
  130. if err != nil {
  131. log.Println("参数验证错误, error=", err)
  132. return treeSectionVaild, err
  133. }
  134. return treeSectionVaild, nil
  135. }
  136. // 模板规则新增项目节
  137. func (s *contractService) ValidRuleSectionDelete(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  138. treeSectionVaild := &viewmodels.TreeSectionContract{}
  139. err := ctx.ReadForm(treeSectionVaild)
  140. if err != nil {
  141. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  142. return treeSectionVaild, err
  143. }
  144. err = treeSectionVaild.ValidateSectionDelete()
  145. if err != nil {
  146. log.Println("参数验证错误, error=", err)
  147. return treeSectionVaild, err
  148. }
  149. return treeSectionVaild, nil
  150. }
  151. func (s *contractService) ValidRuleGet(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  152. treeSectionVaild := &viewmodels.TreeSectionContract{}
  153. err := ctx.ReadForm(treeSectionVaild)
  154. if err != nil {
  155. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  156. return treeSectionVaild, err
  157. }
  158. err = treeSectionVaild.ValidateSectionDelete()
  159. if err != nil {
  160. log.Println("参数验证错误, error=", err)
  161. return treeSectionVaild, err
  162. }
  163. return treeSectionVaild, nil
  164. }
  165. // 验证序号相关
  166. func (s *contractService) ValidRuleSerial(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  167. treeSectionVaild := &viewmodels.TreeSectionContract{}
  168. err := ctx.ReadJSON(treeSectionVaild)
  169. if err != nil {
  170. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  171. return treeSectionVaild, err
  172. }
  173. err = treeSectionVaild.ValidateSectionSerial()
  174. if err != nil {
  175. log.Println("参数验证错误, error=", err)
  176. return treeSectionVaild, err
  177. }
  178. return treeSectionVaild, nil
  179. }
  180. // 新增合同参数验证
  181. func (s *contractService) ValidRuleContractAdd(ctx iris.Context) (*viewmodels.Contracts, error) {
  182. // 创建一个存放前端传过来参数
  183. contractsVaild := &viewmodels.Contracts{}
  184. // 存放raw的值,放入到contractsVaild
  185. err := ctx.ReadJSON(contractsVaild)
  186. if err != nil {
  187. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  188. return contractsVaild, err
  189. }
  190. // 验证合同传参
  191. err = contractsVaild.ValidateAdd()
  192. if err != nil {
  193. log.Println("参数验证错误, error=", err)
  194. return contractsVaild, err
  195. }
  196. // xss
  197. contractsVaild.Code = html.EscapeString(contractsVaild.Code)
  198. contractsVaild.Name = html.EscapeString(contractsVaild.Name)
  199. contractsVaild.Price = html.EscapeString(contractsVaild.Price)
  200. return contractsVaild, nil
  201. }
  202. // 校验编辑接口
  203. func (s *contractService) ValidRuleContractEdi(ctx iris.Context) (*viewmodels.Contracts, error) {
  204. // 创建一个存放前端传过来参数
  205. contractsVaild := &viewmodels.Contracts{}
  206. // 存放raw的值,放入到contractsVaild
  207. err := ctx.ReadJSON(contractsVaild)
  208. if err != nil {
  209. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  210. return contractsVaild, err
  211. }
  212. // 验证合同传参
  213. err = contractsVaild.ValidateEdi()
  214. if err != nil {
  215. log.Println("参数验证错误, error=", err)
  216. return contractsVaild, err
  217. }
  218. contractsVaild.Content = html.EscapeString(contractsVaild.Content)
  219. contractsVaild.Name = html.EscapeString(contractsVaild.Name)
  220. contractsVaild.Price = html.EscapeString(contractsVaild.Price)
  221. contractsVaild.PartyA = html.EscapeString(contractsVaild.PartyA)
  222. contractsVaild.PartyASigner = html.EscapeString(contractsVaild.PartyASigner)
  223. contractsVaild.PartyB = html.EscapeString(contractsVaild.PartyB)
  224. contractsVaild.PartyBSigner = html.EscapeString(contractsVaild.PartyBSigner)
  225. return contractsVaild, nil
  226. }
  227. // 校验删除合同参数
  228. func (s *contractService) ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error) {
  229. // 创建一个存放前端传过来参数
  230. contractsVaild := &viewmodels.Contracts{}
  231. // 存放raw的值,放入到contractsVaild
  232. err := ctx.ReadForm(contractsVaild)
  233. if err != nil {
  234. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  235. return contractsVaild, err
  236. }
  237. // 验证合同传参
  238. err = contractsVaild.ValidateDel()
  239. if err != nil {
  240. log.Println("参数验证错误, error=", err)
  241. return contractsVaild, err
  242. }
  243. return contractsVaild, nil
  244. }
  245. //------------------------------------------------------------
  246. // 获得项目节
  247. func (s *contractService) Get(treeId int, bidsectionId int, projectId int, treeType int) *viewmodels.TreeSectionContract {
  248. // 1.获得项目节
  249. section := s.treeContractDao.Get(treeId, bidsectionId, projectId, treeType)
  250. // 2.构造数据
  251. sectionVM := s.makeSectionView(section)
  252. // 3.更新 上移和下一的限制
  253. youngerBrotherList := s.treeContractDao.GetYoungerBrother(section.Serial, section.Depth, section.ParentId, bidsectionId, projectId, treeType)
  254. if len(youngerBrotherList) == 0 {
  255. sectionVM.IsEnd = true
  256. }
  257. sectionVM.ElderBrother = true
  258. elderBrotherList := s.treeContractDao.GetElderBrother(section.Serial, section.Depth, section.ParentId, bidsectionId, projectId, treeType)
  259. if len(elderBrotherList) == 0 {
  260. sectionVM.ElderBrother = false
  261. }
  262. return sectionVM
  263. }
  264. // 获得合同详情
  265. func (s *contractService) GetContract(contractId int) *viewmodels.Contracts {
  266. contract := s.contractDao.Get(contractId)
  267. contractsVM := makeContractVM(contract)
  268. // contractsVM := &viewmodels.Contracts{}
  269. // id, _ := comm.AesEncrypt(strconv.Itoa(contract.Id), conf.SignSecret)
  270. // treeId, _ := comm.AesEncrypt(strconv.Itoa(contract.TreeId), conf.SignSecret)
  271. // bidsectionId, _ := comm.AesEncrypt(strconv.Itoa(contract.BidsectionId), conf.SignSecret)
  272. // contractsVM.Id = id
  273. // contractsVM.TreeId = treeId
  274. // contractsVM.ContractsType = contract.ContractsType
  275. // contractsVM.BidsectionId = bidsectionId
  276. // contractsVM.Name = contract.Name
  277. // contractsVM.Content = contract.Content
  278. // contractsVM.Code = contract.Code
  279. // contractsVM.PartyA = contract.PartyA
  280. // contractsVM.PartyASigner = contract.PartyASigner
  281. // contractsVM.PartyB = contract.PartyB
  282. // contractsVM.PartyBSigner = contract.PartyBSigner
  283. // contractsVM.Remarks = contract.Remarks
  284. // contractsVM.Price = contract.Price
  285. // contractsVM.Returned = contract.Returned
  286. // contractsVM.Paid = contract.Paid
  287. // contractsVM.Status = contract.Status
  288. // contractsVM.Locking = contract.Locking
  289. // contractsVM.CreateTime = contract.CreateTime.Format(conf.SysTimeform)
  290. // contractsVM.UpdateTime = contract.UpdateTime.Format(conf.SysTimeform)
  291. // contractsVM.SignerTime = contract.SignerTime.Format(conf.SysTimeform)
  292. return &contractsVM
  293. }
  294. // 构建合同详情视图
  295. func makeContractVM(contract *models.CmContracts) viewmodels.Contracts {
  296. contractsVM := viewmodels.Contracts{}
  297. if contract.Id == 0 {
  298. return contractsVM
  299. }
  300. id, _ := comm.AesEncrypt(strconv.Itoa(contract.Id), conf.SignSecret)
  301. treeId, _ := comm.AesEncrypt(strconv.Itoa(contract.TreeId), conf.SignSecret)
  302. bidsectionId, _ := comm.AesEncrypt(strconv.Itoa(contract.BidsectionId), conf.SignSecret)
  303. contractsVM.Id = id
  304. contractsVM.TreeId = treeId
  305. contractsVM.ContractsType = contract.ContractsType
  306. contractsVM.BidsectionId = bidsectionId
  307. contractsVM.Name = contract.Name
  308. contractsVM.Content = contract.Content
  309. contractsVM.Code = contract.Code
  310. contractsVM.PartyA = contract.PartyA
  311. contractsVM.PartyASigner = contract.PartyASigner
  312. contractsVM.PartyB = contract.PartyB
  313. contractsVM.PartyBSigner = contract.PartyBSigner
  314. contractsVM.Remarks = contract.Remarks
  315. contractsVM.Price = contract.Price
  316. contractsVM.Returned = contract.Returned
  317. contractsVM.Paid = contract.Paid
  318. contractsVM.Status = contract.Status
  319. contractsVM.Locking = contract.Locking
  320. contractsVM.CreateTime = contract.CreateTime.Format(conf.SysTimeform)
  321. contractsVM.UpdateTime = contract.UpdateTime.Format(conf.SysTimeform)
  322. // nilTime := time.Time{}
  323. // contract.SignerTime != nilTime
  324. if contract.SignerTime.IsZero() {
  325. contractsVM.SignerTime = contract.SignerTime.Format(conf.SysTimeform)
  326. }
  327. return contractsVM
  328. }
  329. // 新增合同
  330. func (s *contractService) Add(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error {
  331. // 1. 项目节存在
  332. contracts := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  333. if contracts.Id == 0 {
  334. return errors.New("未找到项目节")
  335. }
  336. // k := int32(projectId)
  337. // 2.项目节是没有合同
  338. if contracts.ContractId != 0 {
  339. return errors.New("该项目节上已经存在合同")
  340. }
  341. // 3.新增合同 --合计标段上的金额
  342. contractsCm := &models.CmContracts{}
  343. contractsCm.Code = contractData.Code
  344. contractsCm.Name = contractData.Name
  345. contractsCm.ContractsType = 1
  346. contractsCm.Price = contractData.Price
  347. contractsCm.Returned = "0"
  348. contractsCm.Paid = "0"
  349. contractsCm.TreeId = treeId
  350. contractsCm.ProjectId = projectId
  351. contractsCm.BidsectionId = bidsectionId
  352. contractsCm.Status = 0
  353. contractsCm.CreateTime = time.Now()
  354. contractsCm.UpdateTime = time.Now()
  355. err := s.contractDao.Add(contractsCm)
  356. if err != nil {
  357. return err
  358. }
  359. // 3.获得该标段下合同总数 - 总收入金额
  360. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId, 0)
  361. // 更新标段目录上合同金额和总数
  362. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  363. if err != nil {
  364. return err
  365. }
  366. return nil
  367. }
  368. // 更新合同
  369. func (s *contractService) Update(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error {
  370. // 1. 项目节存在
  371. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  372. if contractsTree.Id == 0 {
  373. return errors.New("未找到项目节")
  374. }
  375. // 2.项目节是没有合同
  376. if contractsTree.ContractId == 0 {
  377. return errors.New("该项目节上没有找到合同")
  378. }
  379. // 3.合同锁定 不能删除
  380. if contractsTree.ContractLocking == 1 {
  381. return errors.New("该合同已锁定")
  382. }
  383. contractsCm := &models.CmContracts{}
  384. contractsCm.Id = contractsTree.ContractId
  385. contractsCm.Content = contractData.Content
  386. contractsCm.Name = contractData.Name
  387. contractsCm.Price = contractData.Price
  388. contractsCm.PartyA = contractData.PartyA
  389. contractsCm.PartyASigner = contractData.PartyASigner
  390. contractsCm.PartyB = contractData.PartyB
  391. contractsCm.PartyBSigner = contractData.PartyBSigner
  392. loc, _ := time.LoadLocation("Local")
  393. SignerTime, err := time.ParseInLocation(conf.SysTimeform, contractData.SignerTime, loc)
  394. if err != nil {
  395. return errors.New("签约时间填写异常")
  396. }
  397. contractsCm.SignerTime = SignerTime
  398. contractsCm.Remarks = contractData.Remarks
  399. columns := []string{"Content", "Name", "Price", "PartyA", "PartyASigner", "PartyB", "PartyBSigner"}
  400. err = s.contractDao.Update(contractsCm, columns, projectId, bidsectionId, treeId)
  401. if err != nil {
  402. return err
  403. }
  404. // 3.获得该标段下合同总数 - 总收入金额
  405. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId, 0)
  406. // 更新标段目录上合同金额和总数
  407. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  408. if err != nil {
  409. return err
  410. }
  411. return nil
  412. }
  413. // 删除合同
  414. func (s *contractService) Delete(projectId int, bidsectionId int, treeId int, id int) error {
  415. // 1. 项目节存在
  416. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  417. if contractsTree.Id == 0 {
  418. return errors.New("未找到项目节")
  419. }
  420. // 2.项目节是没有合同
  421. if contractsTree.ContractId == 0 {
  422. return errors.New("该项目节上没有找到合同")
  423. }
  424. // 3.合同锁定 不能删除
  425. if contractsTree.ContractLocking == 1 {
  426. return errors.New("该合同已锁定")
  427. }
  428. // 删除合同
  429. err := s.contractDao.Delete(projectId, bidsectionId, treeId, id)
  430. if err != nil {
  431. return err
  432. }
  433. // 3.获得该标段下合同总数 - 总收入金额
  434. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId, 0)
  435. // 更新标段目录上合同金额和总数
  436. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  437. if err != nil {
  438. return err
  439. }
  440. // 4.更新回款总金额
  441. err = s.contractReturnDao.UpdateTotalPrice(projectId, bidsectionId, id)
  442. if err != nil {
  443. return err
  444. }
  445. return nil
  446. }
  447. // 关闭合同
  448. func (s *contractService) Close(projectId int, bidsectionId int, treeId int, id int) error {
  449. // 1. 项目节存在
  450. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  451. if contractsTree.Id == 0 {
  452. return errors.New("未找到项目节")
  453. }
  454. // 2.项目节是没有合同
  455. if contractsTree.ContractId == 0 {
  456. return errors.New("该项目节上没有找到合同")
  457. }
  458. // 3.合同锁定 不能删除
  459. if contractsTree.ContractLocking == 1 {
  460. return errors.New("该合同已锁定")
  461. }
  462. // 关闭合同
  463. err := s.contractDao.Close(projectId, bidsectionId, treeId, id)
  464. if err != nil {
  465. return err
  466. }
  467. return nil
  468. }
  469. // 解锁合同
  470. func (s *contractService) Unlock(projectId int, bidsectionId int, treeId int, id int) error {
  471. // 1. 项目节存在
  472. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  473. if contractsTree.Id == 0 {
  474. return errors.New("未找到项目节")
  475. }
  476. // 2.项目节是没有合同
  477. if contractsTree.ContractId == 0 {
  478. return errors.New("该项目节上没有找到合同")
  479. }
  480. // 解锁合同
  481. err := s.contractDao.Unlock(projectId, bidsectionId, treeId, id)
  482. if err != nil {
  483. return err
  484. }
  485. return nil
  486. }
  487. //获得合同收入概况
  488. func (s *contractService) GetSurvey(bidsectionId int, projectId int, contractsType int) map[string]interface{} {
  489. // 1.获得收入合同
  490. year := time.Now().Year()
  491. incomeList := s.contractDao.GetTypeYear(bidsectionId, projectId, contractsType, year)
  492. // 2.初始化
  493. totalContractPrice := 0.00
  494. totalTypePrice := 0.00
  495. performNumber := 0
  496. closeNumber := 0
  497. uncloseNumber := 0
  498. // 3.当年数据初始化
  499. returnDate := map[string]float64{
  500. fmt.Sprintf("%d-01", year): 0.00,
  501. fmt.Sprintf("%d-02", year): 0.00,
  502. fmt.Sprintf("%d-03", year): 0.00,
  503. fmt.Sprintf("%d-04", year): 0.00,
  504. fmt.Sprintf("%d-05", year): 0.00,
  505. fmt.Sprintf("%d-06", year): 0.00,
  506. fmt.Sprintf("%d-07", year): 0.00,
  507. fmt.Sprintf("%d-08", year): 0.00,
  508. fmt.Sprintf("%d-09", year): 0.00,
  509. fmt.Sprintf("%d-10", year): 0.00,
  510. fmt.Sprintf("%d-11", year): 0.00,
  511. fmt.Sprintf("%d-12", year): 0.00,
  512. }
  513. for _, item := range incomeList {
  514. contractPrice, _ := strconv.ParseFloat(item.Price, 64)
  515. totalContractPrice = totalContractPrice + contractPrice
  516. typePrice := 0.00
  517. if contractsType == 1 {
  518. typePrice, _ = strconv.ParseFloat(item.Returned, 64)
  519. totalTypePrice = totalTypePrice + typePrice
  520. } else {
  521. typePrice, _ = strconv.ParseFloat(item.Paid, 64)
  522. totalTypePrice = totalTypePrice + typePrice
  523. }
  524. if item.Status == 0 {
  525. performNumber = performNumber + 1
  526. } else if item.Status == 1 {
  527. uncloseNumber = uncloseNumber + 1
  528. } else if item.Status == 2 {
  529. closeNumber = closeNumber + 1
  530. }
  531. returnDate[item.CreateTime.Format(conf.SysTimeformMonth)] = returnDate[item.CreateTime.Format(conf.SysTimeformMonth)] + typePrice
  532. }
  533. totalContractPrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", totalContractPrice), 64)
  534. totalTypePrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", totalTypePrice), 64)
  535. // ac := accounting.Accounting{Symbol: "", Precision: 2}
  536. surveryData := map[string]interface{}{
  537. "totalContractPrice": totalContractPrice,
  538. "totalContractPriceShow": totalContractPrice,
  539. // "totalReturnPrice": ac.FormatMoney(totalReturnPrice),
  540. "performNumber": performNumber,
  541. "closeNumber": closeNumber,
  542. "uncloseNumber": uncloseNumber,
  543. "returnDate": returnDate,
  544. }
  545. if contractsType == 1 {
  546. surveryData["totalReturnPriceShow"] = totalTypePrice
  547. } else {
  548. surveryData["totalPaidPriceShow"] = totalTypePrice
  549. }
  550. return surveryData
  551. }
  552. // 获得合同总数量和总金额
  553. func (s *contractService) getContractTotalAndPrice(bidsectionId int, projectId int, treeType int) (contractTotal int, priceTotal float64) {
  554. contractListAll := s.treeContractDao.GetContractAll(bidsectionId, projectId)
  555. // 获得收入合同
  556. contractList := s.treeContractDao.GetContract(bidsectionId, projectId, treeType)
  557. priceTotal = 0.00
  558. for _, item := range contractList {
  559. contractPrice, _ := strconv.ParseFloat(item.ContractPrice, 64)
  560. priceTotal = priceTotal + contractPrice
  561. }
  562. // 合同总数
  563. // contractTotal = len(contractList) + 1
  564. contractTotal = len(contractListAll)
  565. // 合同收入总金额
  566. // price, _ := strconv.ParseFloat(priceString, 64)
  567. // priceTotal = priceTotal + price
  568. // 保留2位小数
  569. priceTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", priceTotal), 64)
  570. return contractTotal, priceTotal
  571. }