list.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. <template>
  2. <div class='order-list'>
  3. <van-sticky :offset-top="offsetTop">
  4. <div class="top-banner fs-14 kitbox ">
  5. <div class="box-flex-1">
  6. <form action="/">
  7. <van-search
  8. v-model="searchText"
  9. placeholder="订单号、手机号、社区名称"
  10. @search="onSearch"
  11. shape="round"
  12. >
  13. <!-- <div v-if="type!='pending'" slot="action" class="plr5 search-action">
  14. <div class="sort-panel" @click.stop="onSort">
  15. <div>时间</div>
  16. <div>
  17. <img v-show="sortAsc===true" src="@/assets/images/z-paixu.png" alt="">
  18. <img v-show="sortAsc===false" src="@/assets/images/z-paixu1.png" alt="">
  19. </div>
  20. </div>
  21. <van-icon @click="filterShow=true" style="vertical-align: text-bottom;" color="#17b3ec" size="20px" name="filter-o" />
  22. </div> -->
  23. </van-search>
  24. </form>
  25. </div>
  26. <div>
  27. <div v-if="type!='pending'" slot="action" class="pr15 search-action">
  28. <div class="sort-panel" @click.stop="onSort">
  29. <div>时间</div>
  30. <div>
  31. <img v-show="sortAsc===true" src="@/assets/images/z-paixu.png" alt="">
  32. <img v-show="sortAsc===false" src="@/assets/images/z-paixu1.png" alt="">
  33. </div>
  34. </div>
  35. <van-icon @click="filterShow=true" style="vertical-align: text-bottom;" color="#17b3ec" size="20px" name="filter-o" />
  36. </div>
  37. </div>
  38. <!-- <div @click="drowMenuShow=false" class="kitbox pl15 search-date ptb10">
  39. <div @click="pickDate(1)" class="date-item">{{$moment(startDate).format('YYYY-MM-DD')}}</div>
  40. <div class="ptb5 plr10">至</div>
  41. <div @click="pickDate(2)" class="date-item">{{$moment(endDate).format('YYYY-MM-DD')}}</div>
  42. <div class="pl15 box-flex-1 tr pr15">
  43. <van-button @click="onSearch" type="info" size="mini">搜索</van-button>
  44. </div>
  45. </div>
  46. <div class="drop-menu" :class="{active: drowMenuShow}">
  47. <div class="drop-menu-title tc fs-14" @click="drowMenuShow=!drowMenuShow">
  48. <span class="v-middle">{{selcommunity? selcommunity.hospitalName : '全部社区'}}</span>
  49. <van-icon class="v-middle ml5" name="play" />
  50. </div>
  51. <div class="drop-menu-area kitbox">
  52. <div class="drop-menu-area-left" v-if="townList&&townList.length">
  53. <van-sidebar v-model="activeKey">
  54. <van-sidebar-item v-for="(item, i) in townList" :key="i" :title="item.townName" />
  55. </van-sidebar>
  56. </div>
  57. <div class="drop-menu-area-right">
  58. <div v-for="(item, i) in communityList" :key="i" @click="selcommunity=item;drowMenuShow=false;onSearch()">{{item.hospitalName}}</div>
  59. </div>
  60. </div>
  61. </div> -->
  62. </div>
  63. </van-sticky>
  64. <!-- searchPlaceholder="订单号、金额、手机号" -->
  65. <CustomList
  66. ref="customList"
  67. :searchfun="false"
  68. @onLoad="onLoad">
  69. <div class="list plr15">
  70. <div @click="gotoUrl('/order/detail', {id: item.id})" v-for="(item, i) in list" :key="i" class="item plr15 c-333 fs-14">
  71. <div class="kitbox ptb10 bb-e1e1e1">
  72. <div class="box-flex-1 fs-14">订单编号:{{item.prescribeNum}}</div>
  73. <div v-if="item.sellState==1" class="c-17b3ec">{{item.sellStateName}}</div>
  74. <div v-else class="" >{{item.sellStateName}}</div>
  75. <div>-<span class="c-17b3ec" v-if="item.reviewerState==1">审核通过</span><span class="c-ff5e6c" v-else-if="item.reviewerState==-1">审核不通过</span><span class="c-ff5e6c" v-else-if="item.reviewerState==-2">取消审方</span><span v-else>未审方</span></div>
  76. </div>
  77. <div class="lh20 ptb10">
  78. <div>来源机构:{{item.community}}</div>
  79. <div>订单类型:{{item.orderSource=='厦门i健康'? '线上订单' : "线下订单"}}</div>
  80. <div>开方时间:{{item.orderSource=='厦门i健康'? formatDatetime(item.prescribeTime) : formatDate(item.prescribeTime)}}</div>
  81. <div>取药码:{{item.pickUpNum}}</div>
  82. </div>
  83. <div class="ptb10 bt-e1e1e1 kitbox" v-if="item.amount">
  84. <div class="box-flex-1 lh24"><span v-if="item.amount">¥{{item.amount}}</span></div>
  85. <!-- <div v-if="item.reviewerState==1 || item.reviewerState==-1"><van-button @click.stop="reviewerOrder(item)" size="mini" color="#17b3ec" type="primary">取消审方</van-button></div> -->
  86. </div>
  87. </div>
  88. </div>
  89. </CustomList>
  90. <FilterPanel v-if="type!='pending'" v-model="filterShow" :extendList="extendList" @onSubmit="onSubmit" ref="Filter"/>
  91. <!-- <van-popup v-model="filterShow" position="right">
  92. <div class="fs-14 c-333 plr15 filter-panel">
  93. <div class="ptb10">按社区</div>
  94. <div class="ptb10">按时间</div>
  95. <div class="">
  96. <van-tag type="primary" round>全部</van-tag>
  97. <van-tag type="primary" round>标签</van-tag>
  98. <van-tag type="primary" round>标签</van-tag>
  99. <van-tag type="primary" round>标签</van-tag>
  100. </div>
  101. <div class="ptb10">按类型</div>
  102. <div class="">
  103. <van-tag type="primary" round>全部</van-tag>
  104. <van-tag type="primary" round>标签</van-tag>
  105. <van-tag type="primary" round>标签</van-tag>
  106. </div>
  107. </div>
  108. </van-popup> -->
  109. <van-popup v-model="datePickerShow" position="bottom" >
  110. <van-datetime-picker
  111. v-model="currentDate"
  112. @confirm="onPick"
  113. @cancel="datePickerShow=false"
  114. type="date"
  115. title=""
  116. :max-date="maxDate"
  117. />
  118. </van-popup>
  119. <div class="bot-banner ptb10 bgc-fff">
  120. <div class="kitbox fs-14">
  121. <div class="pr40 box-v-middle pl15">
  122. 共 {{totalCount}} 笔订单
  123. </div>
  124. <!-- <div class="box-flex-1 plr15 tr">
  125. 药品总金额 ¥{{totalMoney}}
  126. </div> -->
  127. </div>
  128. </div>
  129. </div>
  130. </template>
  131. <script>
  132. import FilterPanel from './components/Filter'
  133. import medicineAbinetApi from '@/api/api-medicineAbinet'
  134. import { findOneUser} from "@/api/login";
  135. export default{
  136. name: 'orderList',
  137. props: ['type'],
  138. components:{
  139. FilterPanel
  140. },
  141. data(){
  142. return {
  143. filterShow: false,
  144. searchText: '',
  145. list: [],
  146. currentDate: new Date(),
  147. maxDate: new Date(),
  148. datePickerShow: false,
  149. startDate: this.$moment().subtract(30, 'days'),
  150. endDate: new Date(),
  151. pickType: 1,
  152. totalCount: 0,
  153. totalMoney: 0,
  154. activeKey: 0,
  155. value1: '',
  156. defaultOption: [
  157. { townName: '全部', townCode: "", children: [{hospitalCode: '', hospitalName: '全部'}] },
  158. ],
  159. drowMenuShow: false,
  160. townList: [],
  161. communityList: [],
  162. selcommunity: '',
  163. sellState: '',
  164. extendList: [{
  165. name: "按审方状态",
  166. value: this.type == 'pending'? 0 : '',
  167. opts: [
  168. {name: '全部', value: ""},
  169. {name: '未审方', value: 0},
  170. {name: '审方通过', value: 1},
  171. {name: '审方不通过', value: -1},
  172. // {name: '取消审方', value: -2},
  173. ],
  174. }],
  175. sortAsc: false
  176. }
  177. },
  178. watch: {
  179. activeKey(n){
  180. this.loadChildren()
  181. }
  182. },
  183. created() {
  184. if(this.type == 'pending'){
  185. this.startDate = this.$moment("2000-01-01")
  186. }
  187. },
  188. mounted(){
  189. var allTime = false
  190. if(this.$route.query.hospital||this.$route.query.town){
  191. this.selcommunity = {
  192. hospitalCode: this.$route.query.hospital||'',
  193. hospitalName: this.$route.query.hospitalName||'',
  194. town: this.$route.query.town||'',
  195. townName: this.$route.query.townName||'',
  196. }
  197. }
  198. if(this.$route.query.sellState!==''&&this.$route.query.sellState!==undefined){
  199. this.sellState = this.$route.query.sellState
  200. allTime = true
  201. }
  202. if(this.type != 'pending'){
  203. this.$refs.Filter.submit(this.selcommunity, this.sellState, allTime)
  204. }
  205. },
  206. methods:{
  207. $refreshData(){
  208. this.$refs.customList.refresh(true)
  209. },
  210. onLoad({page, pageSize, searchText}){
  211. var { startDate, endDate } = this
  212. var p
  213. if(this.searchText){
  214. p = {
  215. userId: this.user.id,
  216. content: this.searchText,
  217. timeSort: this.sortAsc? 1 : 2,
  218. page: page,
  219. size: pageSize
  220. }
  221. } else {
  222. var town = '', community = ''
  223. if(this.selcommunity){
  224. community = this.selcommunity.hospitalCode||this.selcommunity.hospital||''
  225. town = community? '' : (this.selcommunity.town||'')
  226. }
  227. p = {
  228. startTime: startDate? this.$moment(startDate).format('YYYY-MM-DD 00:00:00') : '',
  229. endTime: endDate? this.$moment(endDate).format('YYYY-MM-DD 23:59:59') : '',
  230. userId: this.user.id,
  231. community,
  232. sellState: this.sellState,
  233. reviewerState: this.extendList[0].value,
  234. town,
  235. page: page,
  236. size: pageSize,
  237. timeSort: this.sortAsc? 1 : -1,
  238. }
  239. }
  240. console.log('params', p)
  241. medicineAbinetApi
  242. .orderList(p)
  243. .then(res=>{
  244. console.log('orderList', res)
  245. if(res.status == 200){
  246. this.totalCount = res.totalCount
  247. var list = res.detailModelList
  248. this.list = page==1? list : this.list.concat(list)
  249. this.$refs.customList.endLoad(!res.detailModelList || res.detailModelList.length==0, this.list.length)
  250. } else {
  251. this.onLoadError()
  252. }
  253. }).catch(err=>{
  254. console.error(err)
  255. this.onLoadError()
  256. })
  257. },
  258. onLoadError(){
  259. this.list = []
  260. this.totalCount = 0
  261. this.$refs.customList.endLoad(false, true)
  262. },
  263. pickDate(pickType){
  264. this.pickType = pickType
  265. this.currentDate = pickType ==1? this.startDate : this.endDate
  266. this.datePickerShow = true
  267. },
  268. onPick(){
  269. var date = this.$moment(this.currentDate).toDate()
  270. if(this.pickType ==1){
  271. this.startDate = date
  272. } else {
  273. this.endDate = date
  274. }
  275. this.datePickerShow = false
  276. },
  277. onSearch(){
  278. this.list = []
  279. this.$refs.customList.refresh(true)
  280. },
  281. getOrgList(){
  282. findOneUser({
  283. id: this.user.id
  284. }).then(async res => {
  285. // "saasAdmin": "管理员"; regionAdmin" "区域管理员" ; communityAdmin "社区管理员" ; "replenisher": "补货员"
  286. var role = this.user.curRoleCode
  287. var userArea = res.obj.userArea
  288. var townList = [].concat(this.defaultOption)
  289. if(role=='communityAdmin' || role=="replenisher"){
  290. var g = _.groupBy(userArea, 'town')
  291. for(var k in g){
  292. var tmp = g[k][0].concat([])
  293. tmp.children = g[k]
  294. townList.push(tmp)
  295. }
  296. this.townList = townList
  297. } else {
  298. if(role == 'regionAdmin'){
  299. userArea.forEach(v => {
  300. v.children = []
  301. });
  302. this.townList = townList.concat(userArea)
  303. } else if(role=='saasAdmin'){
  304. await medicineAbinetApi
  305. .baseTownList({ filters: "city=350200"})//写死厦门市
  306. .then(res => {
  307. console.log('baseTownList', res)
  308. if (res.status == 200) {
  309. var detailModelList = res.detailModelList;
  310. detailModelList.forEach((item) => {
  311. item.town = item.code
  312. item.townName = item.name
  313. item.children = [];
  314. });
  315. this.townList = townList.concat(detailModelList)
  316. }
  317. });
  318. }
  319. }
  320. this.loadChildren()
  321. });
  322. },
  323. async loadChildren(){
  324. var item = this.townList[this.activeKey]
  325. if(!item.children || !item.children.length){
  326. await medicineAbinetApi
  327. .findOrgList({ code: item.town, paeg: 1, pageSize: 999 })
  328. .then(res => {
  329. console.log('findOrgList', res)
  330. if (res.status == 200) {
  331. res.detailModelList.forEach(v=>{
  332. v.hospitalName = v.name
  333. v.hospitalCode = v.code
  334. })
  335. item.children = res.detailModelList
  336. }
  337. })
  338. .catch(err=>{
  339. item.children = []
  340. })
  341. }
  342. this.communityList = item.children
  343. },
  344. onSubmit(data){
  345. this.startDate = data.startTime
  346. this.endDate = data.endTime
  347. this.selcommunity = data.selcommunity
  348. this.sellState = data.sellState
  349. this.onSearch()
  350. },
  351. reviewerOrder(item){
  352. new Promise((resolve, reject)=>{
  353. this.$dialog.confirm({
  354. title: '提示',
  355. message: '确定取消审核?',
  356. })
  357. .then(() => {
  358. resolve()
  359. })
  360. .catch(() => {
  361. reject()
  362. });
  363. }).then(res=>{
  364. this.$loading('加载中..')
  365. let p = {
  366. orderId: item.id,
  367. reviewerState: -2,
  368. reviewerContent: '',
  369. doctor: this.user.id
  370. }
  371. medicineAbinetApi
  372. .reviewerOrder(p)
  373. .then(res=>{
  374. console.log('reviewerOrder', res)
  375. if(res.status == 200){
  376. this.$toast("操作成功")
  377. item.reviewerState = -2
  378. }
  379. })
  380. .catch(err=>{
  381. console.error(err)
  382. })
  383. }).catch(err=>{
  384. console.error(err)
  385. })
  386. },
  387. onSort(){
  388. this.sortAsc = !this.sortAsc
  389. this.$refs.customList.refresh(true)
  390. }
  391. },
  392. }
  393. </script>
  394. <style lang='scss' scoped>
  395. .order-list{
  396. .custom-list{
  397. height: calc(100vh - 50px);
  398. }
  399. .top-banner{
  400. .search-date{
  401. background: #f2f3f5;
  402. }
  403. .date-item{
  404. width: 110px;
  405. text-align: center;
  406. padding: 5px 0;
  407. border: 1px solid #ccc;
  408. background: #fff;
  409. color: #333;
  410. border-radius: 30px;
  411. }
  412. .van-button--mini{
  413. height: 28px;
  414. width: 60px;
  415. }
  416. .drop-menu{
  417. position: relative;
  418. .van-sidebar-item--select::before{
  419. background-color: #17b3ec;
  420. }
  421. .drop-menu-title{
  422. padding: 10px 0;
  423. background: #fff;
  424. .van-icon{
  425. transform: rotate(90deg);
  426. }
  427. }
  428. .drop-menu-area{
  429. position: absolute;
  430. width: 100%;
  431. left: 0;
  432. display: none;
  433. border-top: 1px solid #e1e1e1;
  434. height: calc(100% - 39px);
  435. .drop-menu-area-right{
  436. height: 100%;
  437. overflow-y: auto;
  438. background: #fff;
  439. -webkit-box-flex: 1;
  440. >div{
  441. padding: 10px 15px;
  442. border-bottom: 1px solid #e1e1e1;
  443. &:last-child{
  444. border-bottom: 0;
  445. }
  446. }
  447. }
  448. }
  449. &.active{
  450. background: rgba($color: #000000, $alpha: .4);
  451. height: calc(100vh - 49px);
  452. .drop-menu-area{
  453. display: -webkit-box;
  454. }
  455. .drop-menu-title{
  456. color: #17b3ec;
  457. .van-icon{
  458. transform: rotate(-90deg);
  459. }
  460. }
  461. }
  462. }
  463. .search-action{
  464. display: -webkit-box;
  465. -webkit-box-align: center;
  466. -webkit-box-pack: center;
  467. background: #fff;
  468. height: 54px;
  469. .sort-panel{
  470. font-size: 16px;
  471. display: -webkit-box;
  472. -webkit-box-align: center;
  473. margin-right: 20px;
  474. img{
  475. display: block;
  476. width: 10px;
  477. height: 10px;
  478. margin-left: 7px;
  479. }
  480. }
  481. }
  482. // ::v-deep .van-dropdown-menu__bar{
  483. // position: absolute;
  484. // bottom: -10px;
  485. // .van-dropdown-menu__item{
  486. // display: none;
  487. // }
  488. // }
  489. }
  490. .list{
  491. .item{
  492. border: 1px solid #e1e1e1;
  493. background: #fff;
  494. margin-top: 10px;
  495. // margin-bottom: 10px;
  496. // &:last-child{
  497. // margin-bottom: 0;
  498. // }
  499. }
  500. }
  501. .bot-banner{
  502. position: fixed;
  503. bottom: 0;
  504. left: 0;
  505. width: 100%;
  506. box-shadow: 0 0 5px #ccc;
  507. }
  508. ::v-deep .van-list__placeholder{
  509. height: 40px;
  510. }
  511. .filter-panel{
  512. background: #fff;
  513. width: 90vw;
  514. height: 100vh;
  515. .van-tag{
  516. width: 95px;
  517. text-align: center;
  518. background: rgb(242, 242, 242);
  519. color: #999;
  520. padding: 5px 0;
  521. justify-content: center;
  522. margin-bottom: 10px;
  523. margin-right: 10px;
  524. &:nth-child(3n){
  525. margin-right: 0;
  526. }
  527. &.active{
  528. background: #17b3ec;
  529. color: #fff;
  530. }
  531. }
  532. }
  533. }
  534. </style>
  535. <style lang="scss">
  536. .mainNobotHasTop{
  537. .order-list{
  538. .custom-list {
  539. height: calc(100vh - 176px);
  540. .search{
  541. top: 96px;
  542. }
  543. }
  544. .top-banner{
  545. .drop-menu{
  546. &.active{
  547. height: calc(100vh - 95px);
  548. }
  549. }
  550. }
  551. }
  552. }
  553. </style>