allSalesTemplate.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. <template>
  2. <div style=" display: inline-block !important;">
  3. <el-button type="primary" size="small" @click="showVisible">{{buttonTitle}}<i class="el-icon-arrow-right el-icon--right"></i></el-button>
  4. <el-drawer
  5. :title="buttonTitle === '客户全部排名'?'客户销售排名':'业务员销售排名'"
  6. :visible.sync="visible"
  7. size="90%"
  8. direction="rtl"
  9. append-to-body
  10. @close="onClose"
  11. >
  12. <div class="drawer__panel_new">
  13. <div>
  14. <div class="div-inline" @click="onChange('订单')">
  15. <span class="title-font" style="color:#4F7BFD" v-if="title === '订单'">订单</span>
  16. <span class="title-font" style="color:#515151" v-else>订单</span>
  17. <img class="inline-16" width="12" height="12" src="../../../assets/icons/sortActivation.svg" alt="" v-if="title === '订单'">
  18. <img class="inline-16" width="12" height="12" src="../../../assets/icons/sort.svg" v-else alt="">
  19. </div>
  20. <div class="div-inline" @click="onChange('出货')">
  21. <span class="title-font" style="color:#4F7BFD" v-if="title === '出货'">出货</span>
  22. <span class="title-font" style="color:#515151" v-else>出货</span>
  23. <img class="inline-16" width="12" height="12" src="../../../assets/icons/sortActivation.svg" alt="" v-if="title === '出货'">
  24. <img class="inline-16" width="12" height="12" src="../../../assets/icons/sort.svg" v-else alt="">
  25. </div>
  26. <div class="div-inline" @click="onChange('开票')">
  27. <span class="title-font" style="color:#4F7BFD" v-if="title === '开票'">开票</span>
  28. <span class="title-font" style="color:#515151" v-else>开票</span>
  29. <img class="inline-16" width="12" height="12" src="../../../assets/icons/sortActivation.svg" alt="" v-if="title === '开票'">
  30. <img class="inline-16" width="12" height="12" src="../../../assets/icons/sort.svg" v-else alt="">
  31. </div>
  32. <div class="div-inline" @click="onChange('回款')">
  33. <span class="title-font" style="color:#4F7BFD" v-if="title === '回款'">回款</span>
  34. <span class="title-font" style="color:#515151" v-else>回款</span>
  35. <img class="inline-16" width="12" height="12" src="../../../assets/icons/sortActivation.svg" alt="" v-if="title === '回款'">
  36. <img class="inline-16" width="12" height="12" src="../../../assets/icons/sort.svg" v-else alt="">
  37. </div>
  38. <span class="search__label">搜索:</span>
  39. <el-input style="width:200px;" placeholder="搜索客户" :suffix-icon="param.content.where.condition?param.content.where.condition.length > 0?'':'':'el-icon-search'" v-model="param.content.where.condition" @keyup.native.enter="listData(param.content.pageNumber = 1)" @clear="listData(param.content.pageNumber = 1)" size="small" class="input-with-select inline-16 layout_search__panel" clearable>
  40. </el-input>
  41. <div class="mt-10 inline-16">
  42. <span class="search__label" v-if="buttonTitle === '客户全部排名'">客户类型:</span>
  43. <el-select v-model="customerType" placeholder="请选择" size="small" class="inline-16" v-if="buttonTitle === '客户全部排名'" @change="onChangeOther" clearable>
  44. <el-option
  45. v-for="item in typeOption"
  46. :key="item.value"
  47. :label="item.value"
  48. :value="item.value">
  49. <span style="float: left">{{ item.value }}</span>
  50. <span style="float: right; color: #8492a6; font-size: 12px">{{ item.remarks?item.remarks:'暂无描述' }}</span>
  51. </el-option>
  52. </el-select>
  53. </div>
  54. <div class="mt-10 inline-16">
  55. <span class="search__label" v-if="buttonTitle === '客户全部排名'">客户分类:</span>
  56. <el-select v-model="customerClass" placeholder="请选择" size="small" class="inline-16" v-if="buttonTitle === '客户全部排名'" @change="onChangeOther" clearable>
  57. <el-option
  58. v-for="item in classOption"
  59. :key="item.value"
  60. :label="item.value"
  61. :value="item.value">
  62. <span style="float: left">{{ item.value }}</span>
  63. <span style="float: right; color: #8492a6; font-size: 12px">{{ item.remarks?item.remarks:'暂无描述' }}</span>
  64. </el-option>
  65. </el-select>
  66. </div>
  67. <div class="mt-10 inline-16">
  68. <span class="search__label">部门:</span>
  69. <el-cascader class="inline-16" ref="selectdep" size="small" v-model="depment" :options="deplist" :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}" @change="selectDep" ></el-cascader>
  70. </div>
  71. <div class="mt-10 inline-16">
  72. <span class="search__label">业务员:</span>
  73. <el-select v-model="person" filterable placeholder="请选择" size="small" @change="selectPerson" >
  74. <el-option
  75. v-for="item in personnelList"
  76. :key="item.index"
  77. :label="item.name"
  78. :value="item.userid">
  79. </el-option>
  80. </el-select>
  81. </div>
  82. <div class="div-inline">
  83. <el-date-picker
  84. v-model="monthDate"
  85. disabled
  86. type="monthrange"
  87. :clearable="false"
  88. style="margin-left:10px;margin-right: 10px"
  89. format="yyyy-MM"
  90. value-format="yyyy-MM"
  91. size="small"
  92. range-separator="至"
  93. start-placeholder="开始月份"
  94. end-placeholder="结束月份">
  95. </el-date-picker>
  96. </div>
  97. </div>
  98. <div style="margin-top: 10px;margin-bottom: 10px">
  99. <tableTemplate ref="table" :layout="tablecols" :data="list" :opwidth="200" :custom="true" :height="height">
  100. <template v-slot:customcol="scope">
  101. <p v-if="scope.column.columnname === 'amount'" >
  102. <span class="highlight-color" v-if="title === '订单'"> ¥{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}</span>
  103. <span v-else> ¥{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}</span>
  104. </p>
  105. <p v-else-if="scope.column.columnname === 'outamount'">
  106. <span class="highlight-color" v-if="title === '出货'"> ¥{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}</span>
  107. <span v-else> ¥{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}</span>
  108. </p>
  109. <p v-else-if="scope.column.columnname === 'taxincludedamount'">
  110. <span class="highlight-color" v-if="title === '开票'"> ¥{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}</span>
  111. <span v-else> ¥{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}</span>
  112. </p>
  113. <p v-else-if="scope.column.columnname === 'writeoffamount'">
  114. <span class="highlight-color" v-if="title === '回款'"> ¥{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}</span>
  115. <span v-else> ¥{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}</span>
  116. </p>
  117. <p v-else-if="scope.column.columnname === 'customersqty'">
  118. <span> {{scope.column.data[scope.column.columnname] == 0?0:scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</span>
  119. </p>
  120. <p v-else-if="scope.column.columnname === 'outcustomer'">
  121. <span> {{scope.column.data[scope.column.columnname] == 0?0:scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</span>
  122. </p>
  123. <p v-else-if="scope.column.columnname === 'projectqty'">
  124. <span> {{scope.column.data[scope.column.columnname] == 0?0:scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</span>
  125. </p>
  126. <p v-else-if="scope.column.columnname === 'outproejct'">
  127. <span> {{scope.column.data[scope.column.columnname] == 0?0:scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</span>
  128. </p>
  129. <p v-else-if="scope.column.columnname === 'rowindex'">
  130. <span style="font-weight: bold">{{scope.column.data[scope.column.columnname]}}</span>
  131. </p>
  132. <p v-else>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
  133. </template>
  134. </tableTemplate>
  135. <div class="div-float container normal-panel">
  136. <span>订单总金额:</span>
  137. <span style="color: red">¥{{tool.formatAmount(totalamount,2)}}</span>
  138. </div>
  139. <div class="div-float container normal-panel">
  140. <span>出货总金额:</span>
  141. <span style="color: red">¥{{tool.formatAmount(totaloutamount,2)}}</span>
  142. </div>
  143. <div class="div-float container normal-panel">
  144. <span>开票总金额:</span>
  145. <span style="color: red">¥{{tool.formatAmount(totaltaxincludedamount,2)}}</span>
  146. </div>
  147. <div class="div-float container normal-panel">
  148. <span>回款总金额:</span>
  149. <span style="color: red">¥{{tool.formatAmount(totalwriteoffamount,2)}}</span>
  150. </div>
  151. <div class="container normal-panel" style="text-align:right;float: right">
  152. <el-pagination
  153. background
  154. @size-change="handleSizeChange"
  155. @current-change="handleCurrentChange"
  156. :current-page="currentPage"
  157. :pager-count="5"
  158. :page-sizes="[50, 100, 200]"
  159. :page-size="50"
  160. layout="total,sizes, prev, pager, next, jumper"
  161. :total="total">
  162. </el-pagination>
  163. </div>
  164. </div>
  165. </div>
  166. </el-drawer>
  167. </div>
  168. </template>
  169. <script>
  170. import tableTemplate from './table';
  171. export default {
  172. name: "allSalesTemplate",
  173. props:['buttonTitle','monthDate','dateType','tablecols','dataid','param','type'],
  174. components:{tableTemplate},
  175. data(){
  176. return {
  177. visible:false,
  178. title:'订单',
  179. list:[],
  180. total:0,
  181. currentPage:0,
  182. height:'calc(100vh - 255px)',
  183. totalamount:0,
  184. totaloutamount:0,
  185. totalwriteoffamount:0,
  186. totaltaxincludedamount:0,
  187. typeOption:[],
  188. classOption:[],
  189. customerType:'',
  190. customerClass:'',
  191. depment:'',
  192. deplist:[],
  193. person:'',
  194. personnelList:[],
  195. depmentParam:{
  196. "id": 20230620102004,
  197. "content": {
  198. }
  199. },
  200. }
  201. },
  202. methods:{
  203. showVisible(){
  204. this.visible = true
  205. this.title = '订单'
  206. this.param.content.pageNumber = 1
  207. this.param.content.pageSize = 50
  208. const usertype = JSON.parse(sessionStorage.getItem('active_account')).usertype
  209. const userName = JSON.parse(sessionStorage.getItem('active_account')).name
  210. const userid = JSON.parse(sessionStorage.getItem('active_account')).userid
  211. if (this.param.content.type == 0){
  212. this.person = usertype!==0?this.param.content.dataid:userid === this.param.content.dataid?userName:this.param.content.dataid
  213. this.depment = ''
  214. }else {
  215. this.depment = this.param.content.dataid
  216. this.person = ''
  217. }
  218. this.queryOptions()
  219. this.departmentrtment()
  220. },
  221. async listData(){
  222. const res = await this.$api.requested(this.param)
  223. this.list = res.data
  224. this.total = res.total
  225. this.currentPage = res.pageNumber
  226. this.totalamount = res.data[0].totalamount
  227. this.totaloutamount = res.data[0].totaloutamount
  228. this.totalwriteoffamount = res.data[0].totalwriteoffamount
  229. this.totaltaxincludedamount = res.data[0].totaltaxincludedamount
  230. },
  231. /*获取部门*/
  232. async departmentrtment() {
  233. const res = await this.$api.requested(this.depmentParam)
  234. this.deplist = this.createMenu(res.data.dep)
  235. this.personnelList = res.data.hr
  236. this.listData()
  237. /*if (this.dataid){
  238. this.depment = this.dataid
  239. this.param.content.dataid = this.dataid
  240. this.param.content.type = 1
  241. this.listData()
  242. }else {
  243. const userid = JSON.parse(sessionStorage.getItem('active_account')).userid
  244. this.depment = ''
  245. this.person = userid
  246. this.param.content.dataid = userid
  247. this.param.content.type = 0
  248. this.listData()
  249. }*/
  250. },
  251. createMenu (array) {
  252. var that = this
  253. let arr = []
  254. function convertToElementTree(node) {
  255. // 新节点
  256. if (node.subdep.length === 0){
  257. var elNode = {
  258. label: node["depname"],
  259. parentid:node['parentid'],
  260. parentname:node['parentname'],
  261. departmentid:node["departmentid"],
  262. value:node["departmentid"],
  263. remarks:node["remarks"],
  264. isused:node["isused"],
  265. changedate:node['changedate'],
  266. changeby:node['changeby'],
  267. createdate:node['createdate'],
  268. createby:node['createby'],
  269. depno:node['depno'],
  270. disabled:that.pageOnlyRead,
  271. }
  272. }else {
  273. var elNode = {
  274. label: node["depname"],
  275. parentid:node['parentid'],
  276. parentname:node['parentname'],
  277. departmentid:node["departmentid"],
  278. value:node["departmentid"],
  279. remarks:node["remarks"],
  280. isused:node["isused"],
  281. changedate:node['changedate'],
  282. changeby:node['changeby'],
  283. createdate:node['createdate'],
  284. createby:node['createby'],
  285. depno:node['depno'],
  286. disabled:that.pageOnlyRead,
  287. children: []
  288. }
  289. }
  290. if (node.subdep && node.subdep.length > 0) {
  291. // 如果存在子节点
  292. for (var index = 0; index < node.subdep.length; index++) {
  293. // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
  294. elNode.children.push(convertToElementTree(node.subdep[index]));
  295. }
  296. }
  297. return elNode;
  298. }
  299. array.forEach((element) => {
  300. arr.push(convertToElementTree(element))
  301. });
  302. return arr
  303. },
  304. handleSizeChange(val) {
  305. // console.log(`每页 ${val} 条`);
  306. this.param.content.pageSize = val
  307. this.listData()
  308. },
  309. handleCurrentChange(val) {
  310. // console.log(`当前页: ${val}`);
  311. this.param.content.pageNumber = val
  312. this.listData()
  313. },
  314. onChange(val){
  315. this.title = val
  316. this.param.content.sequence = val
  317. this.param.content.pageNumber = 1
  318. this.listData()
  319. },
  320. onChangeOther(){
  321. this.param.content.where.customergrade = this.customerClass
  322. this.param.content.where.type = this.customerType
  323. this.param.content.pageNumber = 1
  324. this.listData()
  325. },
  326. async queryOptions(){
  327. const res = await this.$store.dispatch('optiontypeselect','customertypemx')
  328. this.typeOption = res.data
  329. const res1 = await this.$store.dispatch('optiontypeselect','customergrade')
  330. this.classOption = res1.data
  331. },
  332. onClose(){
  333. this.currentPage = 0
  334. this.customerClass = ''
  335. this.customerType = ''
  336. this.param.content.where.condition = ''
  337. },
  338. selectDep(val){
  339. this.person = ''
  340. this.dataid = val[val.length -1]
  341. this.param.content.type = 1
  342. this.param.content.dataid = this.dataid
  343. this.param.content.pageNumber = 1
  344. this.listData()
  345. },
  346. selectPerson(val){
  347. this.depment = ''
  348. this.dataid = val
  349. this.param.content.type = 0
  350. this.param.content.dataid = this.dataid
  351. this.param.content.pageNumber = 1
  352. this.listData()
  353. }
  354. },
  355. mounted() {
  356. }
  357. }
  358. </script>
  359. <style scoped>
  360. .div-inline{
  361. display: inline-block;
  362. }
  363. .title-font{
  364. color: #515151;
  365. font-size: 15px;
  366. display: inline-block !important;
  367. margin-right: 5px;
  368. }
  369. .highlight-color{
  370. color:#4F7BFD
  371. }
  372. .div-float{
  373. float: left;
  374. }
  375. .container{
  376. position: relative;
  377. padding: 16px 16px 0 16px;
  378. }
  379. </style>