packageDetails.vue 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. <template>
  2. <div style="background-color: #f0f2f5; padding-bottom: 20px; min-height: 100%; " >
  3. <div style="padding: 20px; background-color: #fff;">
  4. 套餐包详情
  5. </div>
  6. <div class="content" v-if="item!=null">
  7. <div class="desct">
  8. 套餐包信息
  9. </div>
  10. <el-descriptions title="" :column="3" border>
  11. <el-descriptions-item label="套餐包名称" >
  12. <span v-if="item!=null">{{item.packageName}}</span>
  13. </el-descriptions-item>
  14. <el-descriptions-item label="状态" >
  15. <dict-tag :options="statusOptions" :value="item.status"/>
  16. </el-descriptions-item>
  17. <el-descriptions-item label="类型" >
  18. <dict-tag :options="packageTypeOptions" :value="item.packageType"/>
  19. </el-descriptions-item>
  20. <el-descriptions-item label="子类型" >
  21. <dict-tag :options="packageSubTypeOptions" :value="item.packageSubType"/>
  22. </el-descriptions-item>
  23. <el-descriptions-item label="疾病类型" >
  24. <dict-tag :options="diseaseTypeOptions" :value="item.diseaseType"/>
  25. </el-descriptions-item>
  26. <el-descriptions-item label="总价 元/天" >
  27. <span v-if="item!=null">{{item.price}}</span>
  28. </el-descriptions-item>
  29. <el-descriptions-item label="套餐价" >
  30. <span v-if="item!=null">{{item.totalPrice}}</span>
  31. </el-descriptions-item>
  32. <el-descriptions-item label="周期" >
  33. <span v-if="item!=null">{{item.cycle}}</span>
  34. </el-descriptions-item>
  35. <el-descriptions-item label="签约时长" >
  36. <span v-if="item!=null">{{item.duration}}</span>
  37. </el-descriptions-item>
  38. <el-descriptions-item label="是否展示" >
  39. <dict-tag :options="orOptions" :value="item.isShow"/>
  40. </el-descriptions-item>
  41. <el-descriptions-item label="排序" >
  42. <span v-if="item!=null">{{item.sort}}</span>
  43. </el-descriptions-item>
  44. <el-descriptions-item label="套餐医生" >
  45. <span v-if="item!=null">{{item.doctors}}</span>
  46. </el-descriptions-item>
  47. <el-descriptions-item label="项目" >
  48. <span v-if="selectedProject">{{selectedProject.dictLabel}}</span>
  49. <span v-else>-</span>
  50. </el-descriptions-item>
  51. <el-descriptions-item label="课程" >
  52. <span v-if="selectedCourse">{{selectedCourse.courseName}}</span>
  53. <span v-else>-</span>
  54. </el-descriptions-item>
  55. <el-descriptions-item label="创建时间" >
  56. <span v-if="item!=null">{{item.createTime}}</span>
  57. </el-descriptions-item>
  58. <el-descriptions-item label="修改时间" >
  59. <span v-if="item!=null">{{item.updateTime}}</span>
  60. </el-descriptions-item>
  61. <el-descriptions-item label="封面图" >
  62. <el-image v-for="img in item.imgUrl" :key="img"
  63. style="width: 100px"
  64. :src="img"
  65. :preview-src-list="[img]">
  66. </el-image>
  67. </el-descriptions-item>
  68. <el-descriptions-item label="所属小程序">
  69. <el-tag
  70. v-for="name in appNames"
  71. :key="name"
  72. style="margin-right: 4px"
  73. >
  74. {{ name }}
  75. </el-tag>
  76. </el-descriptions-item>
  77. </el-descriptions>
  78. </div>
  79. <div class="content" v-if="item!=null">
  80. <div class="desct">
  81. 商品内容
  82. </div>
  83. <el-table border width="100%" style="margin-top:5px;" :data="productJson">
  84. <el-table-column label="商品图片" align="center" width="100">
  85. <template slot-scope="scope">
  86. <el-popover
  87. placement="right"
  88. title=""
  89. trigger="hover">
  90. <img slot="reference" :src="scope.row.image" width="50">
  91. <img :src="scope.row.image" style="max-width: 50px;">
  92. </el-popover>
  93. </template>
  94. </el-table-column>
  95. <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="productName" />
  96. <el-table-column label="数量" align="center" prop="count" width="150px" />
  97. <el-table-column label="服用方法" align="center" prop="usageMethod" width="150px" />
  98. <el-table-column label="一日几次" align="center" prop="usageFrequencyUnit" width="150px" />
  99. <el-table-column label="商品编号" align="center" prop="barCode" />
  100. <el-table-column label="商品规格" align="center" prop="sku" />
  101. <el-table-column label="售价" align="center" prop="price" >
  102. <template slot-scope="scope">
  103. <div v-if="scope.row.price!=null">
  104. {{scope.row.price.toFixed(2)}}
  105. </div>
  106. </template>
  107. </el-table-column>
  108. <el-table-column label="小计" align="center" prop="money" >
  109. <template slot-scope="scope">
  110. <div v-if="scope.row.money!=null">
  111. {{scope.row.money.toFixed(2)}}
  112. </div>
  113. </template>
  114. </el-table-column>
  115. </el-table>
  116. </div>
  117. <div class="content" v-if="item!=null">
  118. <div class="desct">
  119. 套餐详情
  120. </div>
  121. <span v-html="item.desc"></span>
  122. </div>
  123. </div>
  124. </template>
  125. <script>
  126. import { listPackage, getPackage, delPackage, addPackage, updatePackage, exportPackage } from "@/api/his/package";
  127. import {list as getAppMallOptions} from '@/api/course/coursePlaySourceConfig';
  128. import { getCourseByProject } from "@/api/course/userCourse";
  129. export default {
  130. name: "patientdetails",
  131. props:["data"],
  132. data() {
  133. return {
  134. // 状态字典
  135. drugList:[],
  136. drugOpen:false,
  137. statusOptions: [],
  138. payTypeOptions: [],
  139. orOptions:[],
  140. packageTypeOptions: [],
  141. diseaseTypeOptions: [],
  142. appMallOptions:[],
  143. // 是否删除字典
  144. isDelOptions: [],
  145. packageSubTypeOptions:[],
  146. item:null,
  147. productJson:[],
  148. // 项目和课程相关
  149. projectOptions: [],
  150. courseOptions: [],
  151. selectedProject: null,
  152. selectedCourse: null,
  153. }
  154. },
  155. computed: {
  156. appNames() {
  157. if (!this.item.appIds) return [];
  158. const ids = this.item.appIds.split(',');
  159. return ids
  160. .map(id => this.appMallOptions.find(opt => opt.appid === id)?.name)
  161. .filter(Boolean); // 过滤掉找不到的
  162. }
  163. },
  164. created() {
  165. this.getDicts("sys_company_status").then(response => {
  166. this.statusOptions = response.data;
  167. });
  168. this.getDicts("sys_company_or").then(response => {
  169. this.isDelOptions = response.data;
  170. this.orOptions = response.data;
  171. });
  172. this.getDicts("sys_package_pay_type").then(response => {
  173. this.payTypeOptions = response.data;
  174. });
  175. this.getDicts("sys_product_type").then(response => {
  176. this.productTypeOptions = response.data;
  177. });
  178. this.getDicts("sys_package_type").then(response => {
  179. this.packageTypeOptions = response.data;
  180. });
  181. this.getDicts("sys_package_sub_type").then(response => {
  182. this.packageSubTypeOptions = response.data;
  183. });
  184. this.getDicts("sys_prescribe_disease_type").then(response => {
  185. this.diseaseTypeOptions = response.data;
  186. });
  187. this.getDicts("sys_course_project").then(response => {
  188. this.projectOptions = response.data;
  189. });
  190. this.getAppMallOptions();
  191. },
  192. methods: {
  193. getAppMallOptions() {
  194. getAppMallOptions({pageNum:1,pageSize:100,isMall:1}).then(response => {
  195. this.appMallOptions = response.rows;
  196. })
  197. },
  198. getDetails(orderId) {
  199. this.item=null;
  200. this.selectedProject = null;
  201. this.selectedCourse = null;
  202. this.courseOptions = [];
  203. getPackage(orderId).then(response => {
  204. this.item = response.data;
  205. this.productJson=JSON.parse(response.data.productJson);
  206. this.item.imgUrl= (this.item.imgUrl).split(",");
  207. // 处理项目显示
  208. if (this.item.projectId) {
  209. this.selectedProject = this.projectOptions.find(project =>
  210. project.dictValue === this.item.projectId.toString()
  211. );
  212. // 获取课程列表
  213. if (this.item.projectId) {
  214. this.getCourseByProject(this.item.projectId).then(() => {
  215. // 设置选中的课程
  216. if (this.item.courseId) {
  217. this.selectedCourse = this.courseOptions.find(course =>
  218. course.courseId.toString() === this.item.courseId.toString()
  219. );
  220. }
  221. });
  222. }
  223. }
  224. });
  225. },
  226. drug(row){
  227. this.drugList=row.row.drug
  228. this.drugOpen=true;
  229. },
  230. /** 根据项目获取课程列表 */
  231. getCourseByProject(projectId) {
  232. return getCourseByProject(projectId).then(response => {
  233. if (response && response.data && Array.isArray(response.data)) {
  234. this.courseOptions = response.data;
  235. } else {
  236. this.courseOptions = [];
  237. }
  238. return response;
  239. }).catch(error => {
  240. console.error("获取课程列表失败:", error);
  241. this.courseOptions = [];
  242. throw error;
  243. });
  244. },
  245. }
  246. }
  247. </script>
  248. <style>
  249. .el-descriptions-item__content {
  250. max-width: 150px;
  251. min-width: 100px;
  252. }
  253. .content{
  254. height: 100%;
  255. background-color: #fff;
  256. padding: 0px 20px 20px;
  257. margin: 20px;
  258. }
  259. .el-descriptions-item__label.is-bordered-label{
  260. font-weight: normal;
  261. }
  262. .desct{
  263. padding-top: 20px;
  264. padding-bottom: 20px;
  265. color: #524b4a;
  266. font-weight: bold;
  267. }
  268. </style>