Kaynağa Gözat

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	jd_logistics-app/pages/order/components/OrderItem.vue
颜琼丽 6 saat önce
ebeveyn
işleme
5b63cecf3f

+ 1 - 1
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/front/controller/WaybillOrderController.java

@@ -31,7 +31,7 @@ public class WaybillOrderController extends BaseController {
      * 查询运单管理列表
      */
     @GetMapping("/list")
-
+    @RequiresPermissions("system:order:list")
     public TableDataInfo list(BizWaybillOrder bizWaybillOrder)
     {
         startPage();

+ 1 - 1
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/front/controller/WxMiniController.java

@@ -65,7 +65,7 @@ public class WxMiniController {
             }
             currentUser.setOpenId(sysUser.getOpenId());
             // 更新用户openid
-            sysUserService.updateUser(currentUser);
+            sysUserService.updateUserProfile(currentUser);
         }
         // 角色集合
         Set<String> roles = permissionService.getRolePermission(currentUser);

+ 15 - 0
jd-logistics-ui-v3/src/api/logistics/monthSummary.js

@@ -49,4 +49,19 @@ export function costDetailsList(query) {
     method: 'get',
     params: query
   })
+}
+//
+export function getAccountAdjustment(query) {
+  return request({
+    url: '/system/costDetails/getAccountAdjustment',
+    method: 'get',
+    params: query
+  })
+}
+export function putAccountAdjustment(query) {
+  return request({
+    url: '/system/costDetails/accountAdjustment',
+    method: 'put',
+    data: query
+  })
 }

+ 269 - 0
jd-logistics-ui-v3/src/views/logistics/monthSummary/costList.vue

@@ -0,0 +1,269 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParamsCost" ref="queryCostRef" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="运单号" prop="externalWaybillNo">
+        <el-input
+            v-model="queryParamsCost.externalWaybillNo"
+            placeholder="请输入运单号"
+            clearable
+            @keyup.enter="handleQueryCost"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQueryCost">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQueryCost">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table v-loading="loadingCost" :data="monthSummaryListCost">
+      <el-table-column label="序号" align="center" type="index"></el-table-column>
+      <el-table-column label="日期" align="center" prop="signTime" show-overflow-tooltip />
+      <el-table-column label="运单号码" align="center" prop="externalWaybillNo" show-overflow-tooltip />
+      <el-table-column label="寄件地区" align="center" prop="senderCity" />
+      <el-table-column label="到件地区" align="center" prop="receiverCity" />
+      <el-table-column label="计费重量" align="center" prop="goodsWeight" />
+      <el-table-column label="产品类型" align="center"  >
+        <template #default="scope">
+          <span v-if="scope.row.orderType == 1">{{formatterOptions(jd_logistics_product_code,scope.row.productCode)}}</span>
+          <span v-if="scope.row.orderType == 2">{{formatterOptions(sf_logistics_product_code,scope.row.productCode)}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="付款方式" align="center"  >
+        <template #default="scope">
+          <span>月结</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="费用(元)" align="center" prop="rateAmount" />
+      <el-table-column label="经手人" align="center" prop="userName" />
+      <el-table-column label="增值费用" align="center" prop="feeItemName" />
+      <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip/>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="100" v-if="routeQuery.status == 1">
+        <template #default="scope">
+          <el-button type="text" @click="handleUpdate(scope.row)" v-hasPermi="['system:costDetails:edit']" >调账</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="totalCost>0"
+        :total="totalCost"
+        v-model:page="queryParamsCost.pageNum"
+        v-model:limit="queryParamsCost.pageSize"
+        @pagination="getCostDetailsList"
+    />
+    <!-- 添加或修改财务月度汇总对话框 -->
+    <el-dialog title="调账" v-model="open" width="70%" append-to-body>
+      <el-form ref="costListRef" :model="form" :rules="rules" label-width="160px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="日期" prop="signTime">
+              <el-input v-model="form.signTime" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="运单号码" prop="externalWaybillNo">
+              <el-input v-model="form.externalWaybillNo" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="寄件地区" prop="senderCity">
+              <el-input v-model="form.senderCity" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="到件地区" prop="receiverCity">
+              <el-input v-model="form.receiverCity" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="计费重量" prop="goodsWeight">
+              <el-input v-model="form.goodsWeight" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="产品类型" prop="goodsType">
+              <el-input v-model="form.goodsType" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="付款方式" prop="payType">
+              <el-input v-model="form.payType" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="费用(元)" prop="rateAmount">
+              <el-input v-model="form.rateAmount" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="经手人" prop="userName">
+              <el-input v-model="form.userName" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="增值费用" prop="feeItemName">
+              <el-input v-model="form.feeItemName" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="remark">
+              <el-input v-model="form.remark" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="调账金额" prop="adjustAmount">
+              <el-input v-model="form.adjustAmount" placeholder="请输入调账金额" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="调账类型" prop="adjustmentType">
+              <el-select v-model="form.adjustmentType" placeholder="请选择">
+                <el-option
+                    v-for="item in adjustment_type"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="调账原因" prop="adjustmentReason">
+              <el-input v-model="form.adjustmentReason" placeholder="请输入调账原因" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="CostList">
+import { ref } from 'vue'
+import { costDetailsList,getAccountAdjustment,putAccountAdjustment } from "@/api/logistics/monthSummary"
+
+const { proxy } = getCurrentInstance()
+
+const route = useRoute()
+const routeQuery = route.query;
+
+const { jd_logistics_product_code } = proxy.useDict("jd_logistics_product_code")
+const { sf_logistics_product_code } = proxy.useDict("sf_logistics_product_code")
+const { adjustment_type } = proxy.useDict("adjustment_type")
+
+const loadingCost = ref(false);
+const monthSummaryListCost = ref([]);
+const totalCost = ref(0);
+const queryParamsCost = ref({
+  pageNum: 1,
+  pageSize: 10,
+})
+const open = ref(false);
+const form = ref({});
+const rules = {
+  adjustAmount: [
+    {
+      required: true, message: '请输入应付金额', trigger: 'blur'
+    },
+    {
+      pattern: /^\d+(\.\d{1,2})?$/,
+      message: "应付金额必须为数字,且最多保留两位小数",
+      trigger: "blur"
+    }
+  ],
+  adjustmentType: [
+    {
+      required: true, message: '请选择调账类型', trigger: 'change'
+    },
+  ]
+}
+const costListRef = ref(null)
+function formatterOptions(options,value){
+  const option = options.find(item => item.value === value)
+  return option ? option.label : value
+}
+
+function getCostDetailsList(row){
+  loadingCost.value = true
+
+  costDetailsList(queryParamsCost.value).then(response => {
+    monthSummaryListCost.value = response.rows
+    totalCost.value = response.total
+    loadingCost.value = false
+  })
+}
+function handleQueryCost(){
+  queryParamsCost.value.pageNum = 1
+  getCostDetailsList()
+}
+function resetQueryCost() {
+  proxy.resetForm("queryCostRef")
+  handleQueryCost()
+}
+function getAccountAdjustmentFn(row){
+  let obj = {
+    summaryMonth:row.summaryMonth,
+    deptId:row.deptId,
+    waybillDetailId:row.waybillDetailId
+  }
+  getAccountAdjustment(obj).then(response => {
+    form.value = response.data;
+    if(row.orderType == 1){
+      form.value.goodsType = formatterOptions(jd_logistics_product_code.value,row.productCode)
+    }else if(row.orderType == 2){
+      form.value.goodsType = formatterOptions(sf_logistics_product_code.value,row.productCode)
+    }
+    form.value.payType = '月结';
+    open.value = true;
+  })
+}
+function handleUpdate(row){
+  getAccountAdjustmentFn(row)
+}
+// 取消按钮
+function cancel() {
+  open.value = false
+  form.value = {};
+  proxy.resetForm("costListRef")
+  if (costListRef.value) {
+    costListRef.value.resetFields();
+  }
+}
+async function submitForm () {
+  if (!costListRef.value) {
+    console.error('Form reference is not available');
+    return;
+  }
+
+  try {
+    // 使用 validate 方法进行表单验证
+    const valid = await costListRef.value.validate();
+
+    if (valid) {
+      // 表单验证通过,提交数据
+      console.log('表单验证通过,准备提交数据:', form.value);
+      putAccountAdjustment(form.value).then(response => {
+        proxy.$modal.msgSuccess("调账成功");
+        open.value = false;
+
+        // 重新加载数据
+        getCostDetailsList();
+      })
+    }
+  } catch (error) {
+    console.error('表单验证失败:', error);
+    // 验证失败,ElForm 会自动显示错误信息
+  }
+}
+getCostDetailsList()
+</script>
+<style scoped>
+.fontBlue{
+  color: #2D71FF;
+}
+</style>

+ 19 - 89
jd-logistics-ui-v3/src/views/logistics/monthSummary/index.vue

@@ -83,14 +83,20 @@
       <el-table-column label="月度汇总id" align="center" prop="summaryId" width="90" />
       <el-table-column label="汇总月份" align="center" >
         <template #default="scope">
-          <div class="fontBlue" @click="detailClick(scope.row)">{{scope.row.summaryMonth}}</div>
+          <el-button
+              type="text"
+              @click="detailClick(scope.row)"
+              v-if="auth.hasPermi('system:costDetails:list')"
+              v-hasPermi="['system:costDetails:list']"
+          >{{scope.row.summaryMonth}}</el-button>
+          <span v-else>{{scope.row.summaryMonth}}</span>
         </template>
       </el-table-column>
       <el-table-column label="应付金额" align="center" prop="payableAmount" />
       <el-table-column label="交易笔数" align="center" prop="transactionCount" />
       <el-table-column label="账单状态" align="center" prop="status" >
         <template #default="scope">
-          <span>{{formatterOptions(monthly_report_status,scope.row.status)}}</span>
+          <dict-tag :options="monthly_report_status" :value="scope.row.status" />
         </template>
       </el-table-column>
       <el-table-column label="供应商" align="center" prop="deptName" />
@@ -174,65 +180,12 @@
       </template>
     </el-dialog>
 
-<!--    查看-->
-    <el-dialog title="查看" v-model="openDetail" width="80%" append-to-body>
-      <el-form :model="queryParamsCost" ref="queryCostRef" :inline="true" v-show="showSearch" label-width="100px">
-        <el-form-item label="运单号" prop="externalWaybillNo">
-          <el-input
-              v-model="queryParamsCost.externalWaybillNo"
-              placeholder="请输入运单号"
-              clearable
-              @keyup.enter="handleQueryCost"
-          />
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" icon="Search" @click="handleQueryCost">搜索</el-button>
-          <el-button icon="Refresh" @click="resetQueryCost">重置</el-button>
-        </el-form-item>
-      </el-form>
-      <el-table v-loading="loadingCost" :data="monthSummaryListCost">
-        <el-table-column label="序号" align="center" type="index"></el-table-column>
-        <el-table-column label="日期" align="center" prop="signTime" show-overflow-tooltip />
-        <el-table-column label="运单号码" align="center" prop="externalWaybillNo" show-overflow-tooltip />
-        <el-table-column label="寄件地区" align="center" prop="senderCity" />
-        <el-table-column label="到件地区" align="center" prop="receiverCity" />
-        <el-table-column label="计费重量" align="center" prop="goodsWeight" />
-        <el-table-column label="产品类型" align="center"  >
-          <template #default="scope">
-            <span v-if="scope.row.orderType == 1">{{formatterOptions(jd_logistics_product_code,scope.row.productCode)}}</span>
-            <span v-if="scope.row.orderType == 2">{{formatterOptions(sf_logistics_product_code,scope.row.productCode)}}</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="付款方式" align="center"  >
-          <template #default="scope">
-            <span>月结</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="费用(元)" align="center" prop="rateAmount" />
-        <el-table-column label="经手人" align="center" prop="userName" />
-        <el-table-column label="增值费用" align="center" prop="feeItemName" />
-        <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip/>
-      </el-table>
-
-      <pagination
-          v-show="totalCost>0"
-          :total="totalCost"
-          v-model:page="queryParamsCost.pageNum"
-          v-model:limit="queryParamsCost.pageSize"
-          @pagination="getCostDetailsList"
-      />
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="openDetail = false">返 回</el-button>
-        </div>
-      </template>
-    </el-dialog>
   </div>
 </template>
 
 <script setup name="MonthSummary">
 import { listMonthSummary, getMonthSummary, delMonthSummary, addMonthSummary, updateMonthSummary,costDetailsList } from "@/api/logistics/monthSummary"
-
+import auth from '@/plugins/auth'
 const { proxy } = getCurrentInstance()
 const { monthly_report_status } = proxy.useDict("monthly_report_status")
 const { jd_logistics_product_code } = proxy.useDict("jd_logistics_product_code")
@@ -248,6 +201,8 @@ const multiple = ref(true)
 const total = ref(0)
 const title = ref("")
 
+const router = useRouter()
+
 const data = reactive({
   form: {},
   queryParams: {
@@ -282,14 +237,6 @@ const data = reactive({
     ]
   }
 })
-const openDetail = ref(false);
-const loadingCost = ref(false);
-const monthSummaryListCost = ref([]);
-const totalCost = ref(0);
-const queryParamsCost = ref({
-  pageNum: 1,
-  pageSize: 10,
-})
 
 const { queryParams, form, rules } = toRefs(data)
 
@@ -408,35 +355,18 @@ function handleExport() {
     ...queryParams.value
   }, `monthSummary_${new Date().getTime()}.xlsx`)
 }
-function formatterOptions(options,value){
-  console.log(options,value)
-  const option = options.find(item => item.value === value)
-  return option ? option.label : value
-}
 // 点击月份查看
 function detailClick(row){
-  openDetail.value = true;
-  queryParamsCost.value.summaryMonth = row.summaryMonth;
-  queryParamsCost.value.deptId = row.deptId;
-  getCostDetailsList();
-}
-function getCostDetailsList(row){
-  loadingCost.value = true
-
-  costDetailsList(queryParamsCost.value).then(response => {
-    monthSummaryListCost.value = response.rows
-    totalCost.value = response.total
-    loadingCost.value = false
+  router.push({
+    path:'/money/costList',
+    query:{
+      summaryMonth:row.summaryMonth,
+      deptId:row.deptId,
+      status:row.status
+    }
   })
 }
-function handleQueryCost(){
-  queryParamsCost.value.pageNum = 1
-  getCostDetailsList()
-}
-function resetQueryCost() {
-  proxy.resetForm("queryCostRef")
-  handleQueryCost()
-}
+console.log(window['hasPermi'])
 getList()
 </script>
 <style scoped>

+ 14 - 2
jd_logistics-app/api/order.js

@@ -50,8 +50,20 @@ export function getOrderList(data) {
  * 查询订单详情
  * 
  */
-export function getOrderDetail({id=''}) {
-  return request.get('mini/order/'+id, {});
+export function getOrderDetail(id) {
+  return request.get(`system/front/order/${id}`);
 }
 
 
+// 取消订单
+export function cancelOrder(data) {
+  return request.put(`system/front/order`,data);
+}
+
+// 查询运单明细
+export function getCostDetails(data) {
+  return request.get(`system//front/costDetails/list`,data);
+}
+
+
+

+ 2 - 2
jd_logistics-app/pages/order/components/OrderFeesInfo.vue

@@ -7,7 +7,7 @@
 		<view class="card-body">
 			<view class="info-row">
 				<text class="info-label">代收货款:</text>
-				<text class="info-value">¥{{orderDetail.shopOrderAmount}}</text>
+				<text class="info-value price">¥{{orderDetail.amount}}</text>
 			</view>
 			<view class="info-row">
 				<text class="info-label">保价{{orderDetail.platformShopCommissionPercent}}%:</text>
@@ -126,7 +126,7 @@
 		border-radius: 16rpx;
 		overflow: hidden;
 		padding: 20rpx;
-
+		margin-bottom: 20rpx;
 		.card-header {
 			display: flex;
 			align-items: center;

+ 10 - 10
jd_logistics-app/pages/order/components/OrderInfo.vue

@@ -11,36 +11,36 @@
 			</view> -->
 			<view class="info-row">
 				<text class="info-label">运单单号:</text>
-				<text class="info-value">{{orderDetail.shopOrderId}}</text>
+				<text class="info-value">{{orderDetail.externalWaybillNo}}</text>
 			</view>
 			<view class="info-row">
 				<text class="info-label">物品信息:</text>
-				<text class="info-value">{{orderDetail.userInfo.nickName}}</text>
+				<text class="info-value">{{orderDetail.goodsName}}</text>
 			</view>
 			<view class="info-row">
 				<text class="info-label">件数:</text>
-				<text class="info-value">{{orderDetail.userInfo.nickName}}</text>
+				<text class="info-value">{{orderDetail.goodsQty}}件</text>
 			</view>
-			<view class="info-row">
+			<view class="info-row" v-if="false">
 				<text class="info-label">付款方式:</text>
 				<!-- <text class="duration">{{ ValidationUtils.encryptPhone(orderDetail.userInfo.userPhone) }}</text> -->
-				<text class="info-value">{{orderDetail.userInfo.userPhone}}</text>
+				<text class="info-value">{{orderDetail.goodsName}}</text>
 			</view>
 			<view class="info-row">
 				<text class="info-label">计费重量:</text>
-				<text class="info-value">{{orderDetail.shopUserTime}}</text>
+				<text class="info-value">{{orderDetail.goodsWeight}}kg</text>
 			</view>
-			<view class="info-row">
+			<view class="info-row" v-if="false">
 				<text class="info-label">实际重量:</text>
-				<text class="info-value">{{orderDetail.orderCreateTime}}</text>
+				<text class="info-value">{{orderDetail.goodsWeight}}kg</text>
 			</view>
 			<view class="info-row">
 				<text class="info-label">实际体积:</text>
-				<text class="info-value price">¥{{orderDetail.shopOrderAmount}}</text>
+				<text class="info-value">{{orderDetail.goodsVolume}}m³</text>
 			</view>
 			<view class="info-row">
 				<text class="info-label">下单时间:</text>
-				<text class="info-value price">¥{{orderDetail.shopOrderAmount}}</text>
+				<text class="info-value">{{orderDetail.createTime}}</text>
 			</view>
 		</view>
 	</view>

+ 91 - 53
jd_logistics-app/pages/order/components/OrderItem.vue

@@ -1,31 +1,33 @@
 <template>
 	<view class="card">
 		<view class="card-header">
-			<text class="waybill-number">运单号:JDVA401410370033</text>
+			<text class="waybill-number">运单号:{{ orderDetail.externalWaybillNo }}</text>
 			<image src="/static/img/copy.png" @click="copyWaybillNumber"></image>
 		</view>
 
 		<view class="content">
 			<!-- 左侧寄件人信息 -->
 			<view class="sender-info">
-				<view class="city-tag">洛阳市</view>
-				<view class="name">下海龙</view>
+				<view class="city-tag">{{ orderDetail.senderCity }}</view>
+				<view class="name">{{ orderDetail.senderName }}</view>
 			</view>
 
 			<view class="translate">
-				<view class="status">待取件</view>
-				<image src="/static/img/translte-1.png"></image>
+				<view class="status">{{ getStatusText(orderDetail.orderStatus) }}</view>
+
+				<image v-if="orderDetail.orderStatus == 5" src="/static/img/translte-1.png"></image>
+				<image v-else src="/static/img/translte-2.png"></image>
 			</view>
 
 			<!-- 右侧收件人信息 -->
 			<view class="receiver-info">
-				<view class="city-tag">北京市</view>
-				<view class="name">周欣源</view>
+				<view class="city-tag">{{ orderDetail.receiverCity }}</view>
+				<view class="name">{{ orderDetail.receiverName }}</view>
 			</view>
 		</view>
 
 		<!-- 状态信息 -->
-		<view class="section-continer">
+		<view class="section-continer" v-if="false">
 			<view class="timeline">
 				<view class="dot">
 					<view class="timeline-dot dot-active"></view>
@@ -43,17 +45,18 @@
 
 		<!-- 操作按钮 -->
 		<view class="action-buttons">
-			<view class="action-btn" @click="showExpressTrack">
+
+			<view v-if="orderDetail.orderStatus > 1 && orderDetail.orderStatus != 6" class="action-btn" @click="showExpressTrack">
 				<text class="btn-text">物流轨迹</text>
 			</view>
 			<view class="action-btn" @click="showOrderInfo">
 				<text class="btn-text">运单详情</text>
 			</view>
-			<view class="action-btn btn-cancel">
+			<view v-if="orderDetail.orderStatus == 1" @click="cancel" class="action-btn btn-cancel">
 				<text class="btn-text">运单取消</text>
 			</view>
 		</view>
-		
+
 		<!-- 物流轨迹弹框 -->
 		<TrackPopup 
 			v-model:showPopup="showTrackPopup" 
@@ -64,7 +67,14 @@
 </template>
 
 <script setup>
-	import { ref, defineProps, defineEmits } from 'vue'
+	import {
+		ref,
+		defineProps,
+		defineEmits
+	} from 'vue'
+	import {
+		cancelOrder
+	} from '@/api/order.js'
 	import TrackPopup from './TrackPopup.vue'
 
 	const emit = defineEmits(['success'])
@@ -75,30 +85,10 @@
 		},
 		orderDetail: {
 			type: Object,
-			default: () => ({
-				goodsMainImage: null,
-				goodsName: null,
-				id: undefined,
-				orderCreateTime: '',
-				shopConfirmStatus: "",
-				shopEvaluateStatus: '',
-				shopDispatchVerifyStatus: "",
-				shopGoodsId: undefined,
-				shopOrderAmount: undefined,
-				shopOrderId: "",
-				shopOrderNum: 1,
-				shopOrderStatus: "1",
-				shopPrice: 102,
-				shopRefundReviewStatus: null,
-				shopServiceStatus: null,
-				shopUserTime: null,
-				userId: "1989219383070896130",
-				userNickName: "bonjour",
-				userPhone: "17639845061"
-			})
+			default: () => ({})
 		}
 	})
-	
+
 	// 控制弹框显示
 	const showTrackPopup = ref(false)
 	const expressData = ref({
@@ -106,24 +96,24 @@
 		number: 'JDVA401410370033',
 		status: '待取件'
 	})
-	
+
 	// 显示物流轨迹弹框
 	const showExpressTrack = () => {
 		// 这里可以调用API获取物流信息
 		// 暂时使用模拟数据
 		showTrackPopup.value = true
 	}
-	
+
 	const showOrderInfo = () => {
 		uni.navigateTo({
-			url:'/pages/order/order_detail'
+			url: `/pages/order/order_detail?waybillId=${props.orderDetail.waybillId}`
 		})
 	}
-	
+
 	// 复制运单号
 	const copyWaybillNumber = () => {
 		uni.setClipboardData({
-			data: 'JDVA401410370033',
+			data: props.orderDetail.externalWaybillNo,
 			success: () => {
 				uni.showToast({
 					title: '运单号已复制',
@@ -132,6 +122,53 @@
 			}
 		})
 	}
+	// 取消订单
+	const cancel = async () => {
+		let res = await cancelOrder({
+			waybillId: props.orderDetail.waybillId,
+			cancelReason: "取消",
+			externalWaybillNo: props.orderDetail.externalWaybillNo,
+			orderType: props.orderDetail.orderType,
+			productCode: props.orderDetail.productCode,
+
+			waybillNo: props.orderDetail.waybillNo,
+		})
+		if (res.code == 200) {
+			uni.showToast({
+				title: res.msg,
+				icon: 'success'
+			})
+			emit('success')
+		}
+	}
+
+	// 获取订单状态
+	const getStatusText = (orderStatus) => {
+		let txt = ''
+		switch (orderStatus) {
+			case 1:
+				txt = '待揽件'
+				break;
+			case 2:
+				txt = '已揽件'
+				break;
+			case 3:
+				txt = '运输中'
+				break;
+			case 4:
+				txt = '派送中'
+				break;
+			case 5:
+				txt = '已签收'
+				break;
+			case 6:
+				txt = '已取消'
+				break;
+			default:
+				break;
+		}
+		return txt;
+	}
 </script>
 
 <style scoped lang="less">
@@ -176,7 +213,8 @@
 				display: flex;
 				flex-direction: column;
 				align-items: center;
-				min-width: 0; /* 防止flex子元素溢出 */
+				min-width: 0;
+				/* 防止flex子元素溢出 */
 
 				.city-tag {
 					max-width: 250rpx;
@@ -239,7 +277,7 @@
 			border-radius: 16rpx;
 			padding: 20rpx;
 			margin-bottom: 20rpx;
-			
+
 			.timeline {
 				display: flex;
 				flex-direction: column;
@@ -247,7 +285,7 @@
 				width: 34rpx;
 				margin-right: 20rpx;
 				flex-shrink: 0;
-				
+
 				.dot {
 					width: 34rpx;
 					height: 34rpx;
@@ -258,33 +296,33 @@
 					align-items: center;
 					flex-shrink: 0;
 				}
-			
+
 				.timeline-dot {
 					width: 18rpx;
 					height: 18rpx;
 					border-radius: 50%;
-					
+
 					&.dot-active {
 						background-color: #1B64F0;
 					}
 				}
-			
+
 				.timeline-line {
 					flex: 1;
 					width: 4rpx;
 					box-sizing: border-box;
 					margin-top: 10rpx;
-					
+
 					&.line-active {
 						border-left: 4rpx dashed #1B64F0;
 					}
 				}
 			}
-			
+
 			.status-section {
 				flex: 1;
 				min-width: 0;
-			
+
 				.status-badge {
 					margin-bottom: 8rpx;
 					height: 48rpx;
@@ -296,7 +334,7 @@
 					text-overflow: ellipsis;
 					white-space: nowrap;
 				}
-			
+
 				.status-detail {
 					font-weight: 400;
 					font-size: 28rpx;
@@ -307,7 +345,7 @@
 					text-overflow: ellipsis;
 					white-space: nowrap;
 				}
-			
+
 				.status-time {
 					margin-top: 8rpx;
 					height: 40rpx;
@@ -321,7 +359,7 @@
 				}
 			}
 		}
-		
+
 		.action-buttons {
 			margin-top: 20rpx;
 			display: flex;
@@ -336,7 +374,7 @@
 				border-radius: 80rpx;
 				border: 2rpx solid #F1F3F8;
 				margin-left: 20rpx;
-		
+
 				&:first-child {
 					margin-left: 0;
 				}
@@ -360,7 +398,7 @@
 						color: #ff6b6b;
 					}
 				}
-				
+
 				/* 添加点击效果 */
 				&:active {
 					opacity: 0.7;

+ 23 - 72
jd_logistics-app/pages/order/index.vue

@@ -17,9 +17,9 @@
 		<!-- </view> -->
 
 		<!-- 订单列表 -->
-		<scroll-view class="order-list" scroll-y="true" @scrolltolower="loadMore">
-			<view v-if="ordersList.length > 0" v-for="order in ordersList" :key="order.id">
-				<OrderItem :order-detail="order" @success="getOrderList(false)"></OrderItem>
+		<view class="order-list" @scrolltolower="loadMore">
+			<view v-if="ordersList.length" v-for="order in ordersList" :key="order.id">
+				<OrderItem :order-detail="order" @success="getOrderList()"></OrderItem>
 			</view>
 			<view class="empty-state" v-else>
 				<u-icon class="empty-icon" name="list" size="60" color="#ccc"></u-icon>
@@ -35,7 +35,7 @@
 				<text>加载中...</text>
 			</view>
 
-		</scroll-view>
+		</view>
 
 
 	</view>
@@ -48,7 +48,8 @@
 	} from 'vue'
 	import {
 		onShow,
-		onLoad
+		onLoad,
+		onReachBottom
 	} from '@dcloudio/uni-app' // 导入 UniApp 的生命周期
 	import OrderItem from './components/OrderItem.vue'
 	import { getOrderListApi } from '../../api/order'
@@ -114,31 +115,8 @@
 	})
 
 	onShow(() => {
-		
-		uni.setStorageSync('senderAddress',{
-			id: '20',
-			name: '姓名',
-			phone: '13000000000',
-			address: '编辑一下地址',
-			provinceName: '天津市',
-			cityName: '天津市',
-			countyName: '和平区',
-			isDefault: false
-		})
-		uni.setStorageSync('receiverAddress',{
-			id: '30',
-			name: '姓名',
-			phone: '13000000000',
-			address: '编辑一下地址',
-			provinceName: '天津市',
-			cityName: '天津市',
-			countyName: '和平区',
-			isDefault: false
-		})
-		
-		
 		// 可以在这里初始化数据
-		getOrderList(false)
+		getOrderList()
 	})
 
 	// Tab切换事件
@@ -146,26 +124,13 @@
 		currentTab.value = index
 		getOrderList(false)
 	}
-	const loadMore = () => {
-		pageNum.value++
-		getOrderList(true)
-	}
 
 	const handleSearch = () => {
-		getOrderList(false)
+		getOrderList()
 	}
 
 	// 获取收益明细列表
-	const getOrderList = async (isLoadMore = false) => {
-		
-		if (loadState.value) return
-
-		if (!isLoadMore) {
-			pageNum.value = 1
-			loadFinished.value = false
-			ordersList.value = []
-		}
-		loadState.value = true
+	const getOrderList = async () => {
 		//orderType: 订单类型(1-全部订单, 2-待确认,  4-已完成, 5-申请退款)
 		try {
 			uni.showLoading({
@@ -175,35 +140,33 @@
 			const params = {
 				pageNum: pageNum.value,
 				pageSize: pageSize.value,
-				orderType: orderType,
+				// orderType: orderType,
 				keyword: searchKeyword.value
 			}
 			var res = await getOrderListApi(params)
 			if (res.code === 200) {
 				const list = res.rows || []
-				const total = res.total || 0
-
-
-				if (isLoadMore) {
-					ordersList.value = [...ordersList.value, ...list]
-				} else {
-					ordersList.value = list
-				}
-				recordTotal.value = total
-				// 判断是否还有更多数据
-				if (list.length < pageSize.value) {
-					loadFinished.value = true
-				}
+
+				ordersList.value = pageNum.value == 1 ? list : [...ordersList.value, ...list]
+				
+				recordTotal.value = Math.ceil(res.total / pageSize.value) || 0
+				
 			}
 		} catch (error) {
 
 		} finally {
-			loadState.value = false
+			
 			uni.hideLoading()
 		}
 	}
 
-
+	// 触底加载更多
+	onReachBottom(() => {
+		if (pageNum.value < recordTotal.value) {
+			pageNum.value++;
+			getOrderList()
+		}
+	})
 	// 查看订单详情
 	const viewOrderDetail = (order) => {
 		uni.showToast({
@@ -214,14 +177,6 @@
 </script>
 
 <style lang="scss" scoped>
-	.container {
-		display: flex;
-		flex-direction: column;
-		height: 100vh;
-		background-color: #F5F7FA;
-	}
-
-
 	.search-section {
 		background-color: #fff;
 		padding: 16rpx;
@@ -278,11 +233,7 @@
 	}
 
 	.order-list {
-		flex: 1;
 		padding: 20rpx;
-		min-height: 500rpx;
-		background-color: #F5F7FA;
-		box-sizing: border-box;
 	}
 
 	.order-card {

+ 49 - 56
jd_logistics-app/pages/order/order_detail.vue

@@ -2,8 +2,6 @@
 	<view class="verification-container">
 		<!-- 内容区域 -->
 		<view class="content">
-
-
 			<!-- 用户信息卡片 -->
 			<view class="info-card1">
 				<view class="address-item">
@@ -12,7 +10,7 @@
 						<!-- <view class="status-text">{{getStatusText}}</view> -->
 					</view>
 					<view class="user-info">
-						<AddressInfo :address="addressSend"/>
+						<AddressInfo :address="addressSend" />
 					</view>
 				</view>
 				<view class="address-item">
@@ -21,7 +19,7 @@
 						<!-- <view class="status-text">{{getStatusText}}</view> -->
 					</view>
 					<view class="user-info">
-						<AddressInfo :address="addressReceive"/>
+						<AddressInfo :address="addressReceive" />
 					</view>
 				</view>
 			</view>
@@ -32,8 +30,10 @@
 			<OrderInfo :order-detail="orderInfo"></OrderInfo>
 
 			<view class="action-title">费用信息</view>
-
-			<OrderFeesInfo :order-detail="orderInfo"/>
+			<view class="" v-for="(item,index) in details.feeList" :key="index">
+				<OrderFeesInfo :order-detail="item" />
+			</view>
+			
 
 		</view>
 	</view>
@@ -51,7 +51,10 @@
 	import OrderInfo from './components/OrderInfo.vue'
 	import OrderFeesInfo from './components/OrderFeesInfo.vue'
 	import AddressInfo from '@/components/AddressInfo.vue'
-
+	import {
+		getOrderDetail,
+		getCostDetails
+	} from '@/api/order.js'
 
 
 	import {
@@ -60,43 +63,12 @@
 	const appStore = useAppStore()
 
 	const shopOrderId = ref('')
-	
-	const addressSend = ref({
-			id: 1,
-			name: '张三',
-			phone: '132****5678',
-			address: '广东省深圳市罗湖区贝丽北路广东省深圳市罗湖区贝丽北路广东省深圳市罗湖区贝丽北路广东省深圳市罗湖区贝丽北路广东省深圳市罗湖区贝丽北路广东省深圳市罗湖区贝丽北路97号',
-			isDefault: true
-		})
-	const addressReceive = ref({
-			id: 1,
-			name: '张三',
-			phone: '132****5678',
-			address: '广东省深圳市罗湖区贝丽北路广东省深圳市罗湖区贝丽北路广东省深圳市罗湖区贝丽北路广东省深圳市罗湖区贝丽北路广东省深圳市罗湖区贝丽北路广东省深圳市罗湖区贝丽北路97号',
-			isDefault: true
-		})
 
-	const orderInfo = ref({
-		createTime: null,
-		goodsInfo: null,
-		goodsMainImage: null,
-		goodsName: "",
-		serviceAvatar: null,
-		serviceBelongShop: "",
-		serviceCommission: "",
-		serviceName: "",
-		servicePhone: "",
-		shopOrderAmount: "",
-		shopOrderId: "",
-		shopOrderNum: 1,
-		userName: "",
-		userPhone: "",
-		dispatchInfo: {},
-		goodsInfo: {},
-		grabInfo: {},
-		userInfo: {}
-	})
+	const addressSend = ref({})
+	const addressReceive = ref({})
 
+	const orderInfo = ref({})
+	const details = ref({})
 	const showOrderCofirmBtn = ref(false)
 	const showOrderDispatchBtn = ref(false)
 	const showOrderRefundBtn = ref(false)
@@ -104,23 +76,42 @@
 
 
 	onLoad((option) => {
-		shopOrderId.value = option.id
-	})
-
-	onShow(() => {
-		// getOrderInfo()
+		shopOrderId.value = option.waybillId;
+		getOrderInfo()
 	})
 
-	const getOrderInfo = () => {
-		const param = {
-			shopOrderId: shopOrderId.value
-		}
-		getOrderInfoApi(param).then(res => {
+	const getOrderInfo = async () => {
+		getOrderDetail(shopOrderId.value).then(res => {
 			if (res.code == 200) {
 				console.log('getOrderInfoApi=========', res)
-				orderInfo.value = res.data
+				orderInfo.value = res.data;
+				addressSend.value = {
+					contactName: res.data.senderName,
+					contactPhone: res.data.senderPhone,
+					provinceName: res.data.senderProvince,
+					cityName: res.data.senderCity,
+					countyName: res.data.senderCounty,
+					detailedAddress: res.data.senderAddress
+				}
+				addressReceive.value = {
+					contactName: res.data.receiverName,
+					contactPhone: res.data.receiverPhone,
+					provinceName: res.data.receiverProvince,
+					cityName: res.data.receiverCity,
+					countyName: res.data.receiverCounty,
+					detailedAddress: res.data.receiverAddress
+				}
 			}
 		})
+
+
+		let result = await getCostDetails({
+			waybillId: shopOrderId.value
+		})
+		if (result.code == 200) {
+			details.value = result.data;
+		}
+		console.log(result, '222')
 	}
 
 	// 返回按钮点击事件
@@ -455,14 +446,16 @@
 			border-radius: 32rpx;
 			padding: 20rpx;
 			margin-bottom: 16rpx;
+
 			// F1F3F8
-			.address-item{
+			.address-item {
 				display: flex;
-												
+
 				&:first-child {
-				    border-bottom: 2rpx solid #F1F3F8;
+					border-bottom: 2rpx solid #F1F3F8;
 					padding-bottom: 20rpx;
 				}
+
 				&:last-child {
 					padding-top: 20rpx;
 				}