Forráskód Böngészése

翻译及处理部分问题

yangg 11 hónapja
szülő
commit
41a092da6e

+ 1 - 1
src/assets/css/tailwind.css

@@ -110,7 +110,7 @@
 
     .sidebar ul.sub-menu li button,
     .sidebar ul.sub-menu li a {
-        @apply flex w-full items-center px-9 py-2.5 before:h-0.5 before:w-2 before:rounded before:bg-gray-300 hover:bg-gray-100
+        @apply flex w-full items-center px-4 py-2.5 before:h-0.5 before:w-2 before:rounded before:bg-gray-300 hover:bg-gray-100
 hover:text-primary hover:before:!bg-primary ltr:before:mr-2 rtl:before:ml-2 dark:before:bg-gray-500 dark:hover:bg-gray-900 dark:hover:text-primary;
     }
     .sidebar ul.sub-menu li button.active,

+ 17 - 5
src/components/TableLayout/index.vue

@@ -1,12 +1,14 @@
 <template>
   <div class="containers dark:!bg-[#060818] p-3" v-loading="loading">
+    <!-- 操作提示 -->
     <div class="tips-info dark:!bg-[#060818]" v-if="tips">
       <slot name="tips"></slot>
     </div>
+    <!-- 工具栏 -->
     <div v-if="toolbar" class="toolbar dark:!bg-[#060818]">
       <slot name="toolbar"></slot>
     </div>
-    <!-- //{ textAlign: 'center' } -->
+    <!-- 表格 -->
     <el-table
       :max-height="height"
       v-bind="$attrs"
@@ -16,7 +18,7 @@
       :data="tableData"
       :row-key="rowKey"
       :stripe="stripe"
-      :header-cell-style="headerCellStyle"
+      :header-cell-style="{ textAlign: 'center' }"
       :cell-style="{ textAlign: 'center' }"
       :style="{ width: '100%', minHeight: height + 'px' }"
       @selection-change="selectionChange"
@@ -25,6 +27,7 @@
     >
       <slot name="table-columns" class="dark:!bg-[#060818]"></slot>
     </el-table>
+    <!-- 分页 -->
     <div v-if="pagination" class="pagination dark:!bg-[#060818]">
       <div class="pagination-toolbar dark:!bg-[#060818]">
         <slot name="pagination-toolbar"></slot>
@@ -37,7 +40,7 @@
 <script>
 import { mapState } from 'vuex';
 export default {
-  name: '',
+  name: 'ResponsiveTable',
   props: {
     /** 是否显示斑纹 */
     stripe: {
@@ -98,7 +101,7 @@ export default {
 };
 </script>
 
-<style  scoped>
+<style scoped>
 .el-table {
   background-color: transparent !important;
 }
@@ -167,4 +170,13 @@ li {
 :deep(.el-table__header) {
   @apply dark:bg-[#060818];
 }
-</style>
+.table-container {
+  overflow-x: auto;
+}
+
+@media (max-width: 768px) {
+  .el-table th, .el-table td {
+    white-space: nowrap;
+  }
+}
+</style>

+ 37 - 84
src/components/layout/Header.vue

@@ -48,9 +48,9 @@
               </router-link>
             </li>
           </ul>
-        </div>
+        </div><!-- items-center -->
         <div
-          class="sm:flex-1 ltr:sm:ml-0 ltr:ml-auto sm:rtl:mr-0 rtl:mr-auto flex items-center space-x-1.5 lg:space-x-2 rtl:space-x-reverse dark:text-[#d0d2d6]"
+          class="sm:flex-1 ltr:sm:ml-0 ltr:ml-auto sm:rtl:mr-0 rtl:mr-auto flex  space-x-1.5 lg:space-x-2 rtl:space-x-reverse dark:text-[#d0d2d6]"
         >
           <div class="sm:ltr:mr-auto sm:rtl:ml-auto">
             <form
@@ -91,10 +91,38 @@
               class="flex items-center p-2 rounded-full bg-white-light/40 dark:bg-dark/40 hover:text-primary hover:bg-white-light/90 dark:hover:bg-dark/60"
               @click="toggleTheme('dark')"
             >
-              <!-- <icon-laptop /> -->
               <icon-sun />
             </a>
           </div>
+
+          <div class="dropdown shrink-0">
+            <Popper :placement="store.state.rtlClass === 'rtl' ? 'bottom-end' : 'bottom-start'" offsetDistance="8">
+              <button
+                type="button"
+                class="pt-2 block p-2 rounded-full bg-white-light/40 dark:bg-dark/40 hover:text-primary hover:bg-white-light/90 dark:hover:bg-dark/60"
+              >
+                <img :src="currentFlag" alt="flag" class="w-5 h-5 object-cover rounded-full" />
+              </button>
+              <template #content="{ close }">
+                <ul class="!px-2 text-dark dark:text-white-dark grid grid-cols-2 gap-2 font-semibold dark:text-white-light/90 w-[280px]">
+                  <template v-for="item in store.state.languageList" :key="item.code">
+                    <li>
+                      <button
+                        type="button"
+                        class="w-full hover:text-primary"
+                        :class="{ 'bg-primary/10 text-primary': i18n.locale === item.code }"
+                        @click="changeLanguage(item), close()"
+                      >
+                        <img class="w-5 h-5 object-cover rounded-full" :src="`/assets/images/flags/${item.code.toUpperCase()}.svg`" alt="" />
+                        <span class="ltr:ml-3 rtl:mr-3">{{ item.name }}</span>
+                      </button>
+                    </li>
+                  </template>
+                </ul>
+              </template>
+            </Popper>
+          </div>
+
           <div class="dropdown shrink-0 mr-2">
             <Popper :placement="store.state.rtlClass === 'rtl' ? 'bottom-start' : 'bottom-end'" offsetDistance="0">
               <el-badge :value="countNot" :hidden="countNot == 0" class="item">
@@ -158,81 +186,6 @@
               </template> -->
             </Popper>
           </div>
-          <!-- <div class="dropdown shrink-0">
-                        <Popper :placement="store.state.rtlClass === 'rtl' ? 'bottom-end' : 'bottom-start'"
-                            offsetDistance="8">
-                            <button type="button"
-                                class="relative block p-2 rounded-full bg-white-light/40 dark:bg-dark/40 hover:text-primary hover:bg-white-light/90 dark:hover:bg-dark/60">
-                                <icon-bell-bing />
-
-                                <span class="flex absolute w-3 h-3 ltr:right-0 rtl:left-0 top-0">
-                                    <span
-                                        class="animate-ping absolute ltr:-left-[3px] rtl:-right-[3px] -top-[3px] inline-flex h-full w-full rounded-full bg-success/50 opacity-75"></span>
-                                    <span class="relative inline-flex rounded-full w-[6px] h-[6px] bg-success"></span>
-                                </span>
-                            </button>
-                            <template #content="{ close }">
-                                <ul
-                                    class="!py-0 text-dark dark:text-white-dark w-[300px] sm:w-[350px] divide-y dark:divide-white/10">
-                                    <li>
-                                        <div class="flex items-center px-4 py-2 justify-between font-semibold">
-                                            <h4 class="text-lg">Notification</h4>
-                                            <template v-if="notifications.length">
-                                                <span class="badge bg-primary/80"
-                                                    v-text="notifications.length + 'New'"></span>
-                                            </template>
-</div>
-</li>
-<template v-for="notification in notifications" :key="notification.id">
-                                        <li class="dark:text-white-light/90">
-                                            <div class="group flex items-center px-4 py-2">
-                                                <div class="grid place-content-center rounded">
-                                                    <div class="w-12 h-12 relative">
-                                                        <img class="w-12 h-12 rounded-full object-cover"
-                                                            :src="`/assets/images/${notification.profile}`" alt="" />
-                                                        <span
-                                                            class="bg-success w-2 h-2 rounded-full block absolute right-[6px] bottom-0"></span>
-                                                    </div>
-                                                </div>
-                                                <div class="ltr:pl-3 rtl:pr-3 flex flex-auto">
-                                                    <div class="ltr:pr-3 rtl:pl-3">
-                                                        <h6 v-html="notification.message"></h6>
-                                                        <span class="text-xs block font-normal dark:text-gray-500"
-                                                            v-text="notification.time"></span>
-                                                    </div>
-                                                    <button type="button"
-                                                        class="ltr:ml-auto rtl:mr-auto text-neutral-300 hover:text-danger opacity-0 group-hover:opacity-100"
-                                                        @click="removeNotification(notification.id)">
-                                                        <icon-x-circle />
-                                                    </button>
-                                                </div>
-                                            </div>
-                                        </li>
-                                    </template>
-<template v-if="notifications.length">
-                                        <li>
-                                            <div class="p-4">
-                                                <button class="btn btn-primary block w-full btn-small"
-                                                    @click="close()">Read All Notifications</button>
-                                            </div>
-                                        </li>
-                                    </template>
-<template v-if="!notifications.length">
-                                        <li>
-                                            <div
-                                                class="!grid place-content-center hover:!bg-transparent text-lg min-h-[200px]">
-                                                <div
-                                                    class="mx-auto ring-4 ring-primary/30 rounded-full mb-4 text-primary">
-                                                    <icon-info-circle :fill="true" class="w-10 h-10" />
-                                                </div>
-                                                No data available.
-                                            </div>
-                                        </li>
-                                    </template>
-</ul>
-</template>
-</Popper>
-</div> -->
 
           <div class="dropdown shrink-0">
             <Popper :placement="store.state.rtlClass === 'rtl' ? 'bottom-end' : 'bottom-start'" offsetDistance="8" class="!block">
@@ -262,20 +215,20 @@
                         <h4 class="text-base">
                           {{ store.state.user.user.username }}<span class="text-xs bg-success-light rounded text-success px-1 ltr:ml-2 rtl:ml-2">Pro</span>
                         </h4>
-                        <!-- <a class="text-black/60 hover:text-primary dark:text-dark-light/60 dark:hover:text-white" href="javascript:;">johndoe@gmail.com</a> -->
+                        <a class="text-black/60 hover:text-primary dark:text-dark-light/60 dark:hover:text-white" href="javascript:;">{{store.state.user.user.company_vo.name}}</a>
                       </div>
                     </div>
                   </li>
                   <li>
                     <a href="javascript:;" class="dark:hover:text-white" @click="goInfo">
                       <icon-user class="w-4.5 h-4.5 ltr:mr-2 rtl:ml-2 shrink-0" />
-                      个人信息
+                      {{$t('info')}}
                     </a>
                   </li>
                   <li>
                     <a href="javascript:;" class="dark:hover:text-white" @click="editPassword">
                       <icon-lock-dots class="w-4.5 h-4.5 ltr:mr-2 rtl:ml-2 shrink-0" />
-                      修改密码
+                      {{$t('edit_password')}}
                     </a>
                   </li>
                   <li class="border-t border-white-light dark:border-white-light/10">
@@ -314,12 +267,12 @@ import IconMoon from '@/components/icon/icon-moon.vue';
 import IconLaptop from '@/components/icon/icon-laptop.vue';
 import IconMailDot from '@/components/icon/icon-mail-dot.vue';
 import IconArrowLeft from '@/components/icon/icon-arrow-left.vue';
-/* import IconInfoCircle from '@/components/icon/icon-info-circle.vue';
+ import IconInfoCircle from '@/components/icon/icon-info-circle.vue';
 import IconBellBing from '@/components/icon/icon-bell-bing.vue';
 import IconUser from '@/components/icon/icon-user.vue';
 import IconMail from '@/components/icon/icon-mail.vue';
 import IconLockDots from '@/components/icon/icon-lock-dots.vue';
-import IconLogout from '@/components/icon/icon-logout.vue'; */
+import IconLogout from '@/components/icon/icon-logout.vue';/* */
 import IconMenuDashboard from '@/components/icon/menu/icon-menu-dashboard.vue';
 import IconCaretDown from '@/components/icon/icon-caret-down.vue';
 import IconMenuApps from '@/components/icon/menu/icon-menu-apps.vue';
@@ -347,7 +300,7 @@ const founder = computed(() => store.state.user.user.founder);
 const currentFlag = computed(() => {
   return `/assets/images/flags/${i18n.locale.toUpperCase()}.svg`;
 });
-
+console.log(store.state.user.user);
 const countNot = ref(0);
 /* 获取账号未读消息 */
 const GET_countNot = () => {

+ 175 - 101
src/locales/en.json

@@ -1,110 +1,184 @@
 {
-    "dashboard": "Dashboard",
-    "sales": "Sales",
-    "analytics": "Analytics",
-    "apps": "Apps",
-    "components": "Components",
-    "elements": "Elements",
-    "font_icons": "Font Icons",
-    "widgets": "Widgets",
-    "tables": "Tables",
-    "datatables": "Data Tables",
-    "forms": "Forms",
-    "users": "Users",
-    "pages": "Pages",
-    "authentication": "Authentication",
-    "drag_and_drop": "Drag and Drop",
-    "maps": "Maps",
-    "charts": "Charts",
-    "starter_kit": "Starter Kit",
-    "documentation": "Documentation",
-    "ui_kit": "UI Kit",
-    "more": "More",
-    "finance": "Finance",
-    "crypto": "Crypto",
-    "chat": "Chat",
-    "mailbox": "Mailbox",
-    "todo_list": "Todo List",
-    "notes": "Notes",
-    "scrumboard": "Scrumboard",
-    "contacts": "Contacts",
-    "invoice": "Invoice",
-    "list": "List",
-    "preview": "Preview",
+    "warehouse": "Warehouse Management",
+  "warehouseList": "Warehouse List",
+  "goodsLend": "Location Management",
+  "goodsTransfer": "Inventory List",
+  "goodsExchange": "Inbound Management",
+  "goodsOutBound": "Outbound Management",
+  "goodsInventory": "Inventory Check",
+  "goodsInventoryLoss": "Inventory Loss",
+  "goodsUnderstock": "Transfer List",
+  "configMsg": "Message Configuration", 
+
+    "setting": "System Management",
+    "companyList": "Company List",
+    "roleManage": "Role Management",
+    "dicData": "Data Dictionary",
+    "menuManage": "Menu Management",
+    "systemLog": "Operation Records",
+    "branch": "Department Management",
+    "package": "Package Management",
+    "packageList": "Package List",
+    "packagePermissions": "Package Permissions",
+    "templateManage": "Template Management",
+    "smsTemplate": "SMS Template",
+    "systemMessage": "System Message Template",
+    "emailtemplate": "Email Template",
+    "accountTemplate": "Public Account Template",
+
+    "companyMent": "Company Management",
+    "administratorManage": "Personnel Management",
+    "companyInfo": "Company Details",
+    "goods": "Goods Management",
+    "SKUList": "Goods List",
+    "warehouseLocation": "Warehouse Location",
+    "addInventory": "Add Inventory",
+    "synchronous": "Synchronize",
+
     "add": "Add",
     "edit": "Edit",
+    "view": "View",
+    "delete": "Delete",
+    "review": "Review",
+    "down": "Reject",
+    "print": "Print",
+    "preview": "Preview",
+    "search": "Search",
+    "operate": "Operate",
+    "submit": "Submit",
+    "cancel": "Cancel",
+    "return": "Return",
+    "save": "Save",
+    "place": "Please Enter",
+    "content": "Content",
+    "select": "Select",
+    "scan_code": "Scan Code for Entry",
+    "out_code": "Scan Code for Exit",
+    "change": "Please Select",
+    "notes": "Notes",
+    "date": "Date and Time",
+    "diff": "Difference",
+    "type": "Type",
+    "unknown": "Unknown Type",
+    "add_success": "Added Successfully",
+    "sub_success": "Saved Successfully",
+    "edit_success": "Edited Successfully",
+    "set_success": "Set Successfully",
+    "audit_success": "Reviewed Successfully",
+    "down_success": "Rejected Successfully",
+    "prompt": "Prompt",
+    "rejected": "Rejected!",
+    "reject_reason": "Please Fill in the Rejection Reason!",
+    "confirm_rejec": "Are You Sure to Reject?",
+    "del_info": "Are You Sure to Delete?",
+    "del_success": "Deleted Successfully",
+    "form_erroe": "Form Filling Error, Please Check!",
+    "search_placeholde": "Please Enter Keywords to Search",
+    
+    "warechouse": "Warehouse",
+    "warechouse_sn": "Warehouse Number",
+    "warechouse_name": "Warehouse Name",
+    "warechouse_user_name": "Person in Charge Name",
+    "warechouse_phone": "Person in Charge Phone Number",
+    "warechouse_address": "Warehouse Address",
+    "warechouse_remark": "Warehouse Description",
+    "warechouse_code": "Location Number",
+    "warechouse_area": "Location Area",
+    "warechouse_sku": "Bound SKU Count",
+    "location_notes": "Location Description",
+    "location_code": "Area Number",
+    "location_name": "Area Name",
+    "actual_stock": "Actual Stock",
+    "usable_stock": "Usable Stock",
+    "transit_stock": "In-Transit Stock",
+    "locked_stock": "Frozen Stock",
+    "warning_stock": "Warning Stock",
+    "transitDetails": "In-Transit Details",
+    "order_sn": "Order Number",
+    "transit_num": "In-Transit Quantity",
+    "return_date": "Return Date",
+    "setNumber": "Set Warning Quantity",
+    "warningQuantity": "Warning Quantity",
+    "integer": "Positive Integer",
+    "warehousing": "Warehousing",
+    "access_time": "Access Time",
+    "start_time": "Start Time",
+    "end_time": "End Time",
+    "storage_type": "Storage Type",
+    "customer_name": "Customer Name",
+    "phone": "Phone Number",
+    "warehousing_sn": "Warehousing Number",
+    "warehousing_num": "Warehousing Quantity",
+    "warehousing_in_num": "Warehoused Quantity",
+    "not_entry_num": "Not Warehoused Quantity",
+    "warehousing_type": "Warehousing Type",
+    "warehousing_time": "Warehousing Time",
+    "warehousing_state": "Status",
+    "inStock": "Warehoused",
+    "notStock": "Not Warehoused",
+    "reject": "Rejection Reason",
+
+    "addOut":"Add Outbound",
+    "outBound": "Outbound",
+    "out_sn": "Outbound Number",
+    "out_type": "Outbound Type",
+    "out_num": "Outbound Quantity",
+
+    "inven": "Inventory",
+    "inventory": "Inventory List",
+    "creator": "Creator",
+    "reviewer": "Reviewer",
+    "notifiedre": "Notify Reviewer",
+    "goods_code": "Goods Scan Code",
+    "inventoryType": "Inventory Type",
+    "inventoryDate": "Inventory Date",
+    "inventoryPeople": "Inventory Person",
+    "inventorySn": "Inventory Number",
+    "inventory_time": "Inventory Time",
+    "stock": "Stock Quantity",
+    "inventory_num": "Inventory Quantity",
+
+    "goods_info": "Goods",
+    "goods_sn": "Goods Number",
+    "goods_name": "Goods Name",
+    "goods_unit": "Unit",
+    "goods_inventory": "Goods Details",
+
+    "order_num": "Order Quantity",
+    "return_num": "Return Quantity",
+
+    "inOut": "Outbound",
+    "notOut": "Not Outbound",
+    "outTime": "Outbound Time",
+
+    "loss_goods": "Damaged Goods",
+    "loss_date": "Damage Date",
+    "loss_people": "Damage Person",
+    "loss_sn": "Damage Number",
+    "loss_desc": "Damage Description",
+    "loss_time": "Damage Time",
+    "loss_type": "Damage Type",
+    "loss_num": "Damage Quantity",
+
+    "search_goods": "Search Goods",
+    "transfer_goods": "Transfer Goods",
+    "out_warehouse": "Outgoing Warehouse",
+    "to_warehouse": "Incoming Warehouse",
+    "transfer_time": "Transfer Time",
+    "transfer_sn": "Transfer Number",
+    "transfer_num": "Transfer Quantity",
+    "delivery_method": "Delivery Method",
+    "transfer_order": "Transfer Order",
+
+    "brand": "Brand",
+    "weight": "Weight",
+    "consistent": "Cannot Be Consistent",
+
+    "goods_tips":"The item is out of stock!",
     "calendar": "Calendar",
     "tabs": "Tabs",
-    "accordions": "Accordions",
-    "modals": "Modals",
-    "cards": "Cards",
-    "carousel": "Carousel",
-    "countdown": "Countdown",
-    "counter": "Counter",
-    "sweet_alerts": "Sweet Alerts",
-    "timeline": "Timeline",
-    "notifications": "Notifications",
-    "media_object": "Media Object",
-    "list_group": "List Group",
-    "pricing_tables": "Pricing Tables",
-    "lightbox": "Lightbox",
-    "alerts": "Alerts",
-    "avatar": "Avatar",
-    "badges": "Badges",
-    "breadcrumbs": "Breadcrumbs",
-    "buttons": "Buttons",
-    "button_groups": "Button Groups",
-    "color_library": "Color Library",
-    "dropdown": "Dropdown",
-    "infobox": "Infobox",
-    "jumbotron": "Jumbotron",
-    "loader": "Loader",
-    "pagination": "Pagination",
-    "popovers": "Popovers",
-    "progress_bar": "Progress Bar",
-    "search": "Search",
-    "tooltips": "Tooltips",
-    "treeview": "Treeview",
-    "typography": "Typography",
-    "basic": "Basic",
-    "order_sorting": "Order Sorting",
-    "multi_column": "Multi Column",
-    "multiple_tables": "Multiple Tables",
-    "alt_pagination": "Alt. Pagination",
-    "range_search": "Range Search",
-    "export": "Export",
-    "input_group": "Input Group",
-    "layouts": "Layouts",
-    "validation": "Validation",
-    "input_mask": "Input Mask",
-    "select2": "Select2",
-    "touchspin": "Touchspin",
-    "checkbox_and_radio": "Checkbox & Radio",
-    "switches": "Switches",
-    "wizards": "Wizards",
-    "file_upload": "File Upload",
-    "quill_editor": "Quill Editor",
-    "markdown_editor": "Markdown Editor",
-    "date_and_range_picker": "Date & Range Picker",
-    "clipboard": "Clipboard",
-    "user_and_pages": "User And Pages",
-    "profile": "Profile",
-    "account_settings": "Account Settings",
-    "knowledge_base": "Knowledge Base",
-    "contact_form": "Contact Form",
-    "faq": "Faq",
-    "coming_soon": "Coming Soon",
     "error": "Error",
-    "maintenence": "Maintenence",
-    "login_boxed": "Login Boxed",
-    "register_boxed": "Register Boxed",
-    "unlock_boxed": "Unlock Boxed",
-    "recover_id_boxed": "Recover Id Boxed",
-    "login_cover": "Login Cover",
-    "register_cover": "Register Cover",
-    "unlock_cover": "Unlock Cover",
-    "recover_id_cover": "Recover Id Cover",
-    "supports": "Supports",
+    
     "login": "Login",
     "lockscreen": "Lockscreen",
     "password_recovery": "Password Recovery",

+ 62 - 3
src/locales/zh.json

@@ -47,14 +47,29 @@
     "operate":"操 作",
     "submit":"确 定",
     "cancel":"取 消",
+    "return":"返回",
+    "save":"保存",
     "place":"请输入",
     "content":"内容",
+    "select":"选择",
+    "scan_code":"扫码入库",
+    "out_code":"扫码出库",
     "change":"请选择",
     "notes":"备注",
+    "date":"日期时间",
+    "diff":"差异",
+    "type":"类型",
+    "unknown":"未知类型",
     "add_success":"添加成功",
+    "sub_success":"保存成功",
     "edit_success":"修改成功",
     "set_success":"设置成功",
+    "audit_success":"审核成功",
+    "down_success":"驳回成功",
     "prompt":"提示",
+    "rejected":"已拒绝!",
+    "reject_reason":"请填写驳回原因!",
+    "confirm_rejec":"确定拒绝吗?",
     "del_info":"确定要删除吗?",
     "del_success":"删除成功",
     "form_erroe":"表单填写有误,请核对!",
@@ -93,34 +108,74 @@
     "customer_name":"客户名称",
     "phone":"手机号",
     "warehousing_sn":"入库单号",
+    "warehousing_num":"入库数量",
+    "warehousing_in_num":"已入库数量",
+    "not_entry_num":"未入库数量",
     "warehousing_type":"入库类型",
     "warehousing_time":"入库时间",
     "warehousing_state":"状态",
     "inStock":"已入库",
     "notStock":"未入库",
+    "reject":"驳回原因",
 
+    "addOut":"新增出库",
     "outBound":"出库",
     "out_sn":"出库单号",
     "out_type":"出库类型",
+    "out_num":"出库数量",
 
+    "inven":"盘点",
+    "inventory":"盘点单",
+    "creator":"制单人",
+    "reviewer":"审核人",
+    "notifiedre":"是否通知审核人",
+    "goods_code":"商品扫码",
+    "inventoryType":"盘点类型",
     "inventoryDate":"盘点日期",
     "inventoryPeople":"盘点人",
     "inventorySn":"盘点单编号",
-    "inventory_time":"盘点日期",
+    "inventory_time":"盘点时间",
+    "stock":"库存数量",
+    "inventory_num":"盘点数量",
 
+    "goods_info":"商品",
     "goods_sn":"商品编号",
-    "goods_name":"商品编号",
+    "goods_name":"商品名称",
     "goods_unit":"单位",
+    "goods_inventory":"商品明细",
+
+    "order_num":"订单数量",
+    "return_num":"退货数量",
+
     "inOut":"已出库",
     "notOut":"未出库",
     "outTime":"出库时间",
 
+    "loss_goods":"报损商品",
     "loss_date":"报损日期",
     "loss_people":"报损人",
     "loss_sn":"报损单编号",
     "loss_desc":"报损说明",
+    "loss_time":"报损时间",
+    "loss_type":"报损类型",
+    "loss_num":"报损数量",
+
+    "search_goods":"搜索商品",
+    "transfer_goods":"调拨商品",
+    "out_warehouse":"调出仓库",
+    "to_warehouse":"调入仓库",
+    "transfer_time":"调拨时间",
+    "transfer_sn":"调拨单号",
+    "transfer_num":"调拨数量",
+    "delivery_method":"配送方式",
+    "transfer_order":"调拨单",
 
-    "from_warehouse":"调出仓库",
+    
+
+    "brand":"品牌",
+    "weight":"重量",
+    "consistent":"不能一致",
+    
 
     "tabs": "标签",
     "error": "错误",
@@ -132,6 +187,10 @@
     "500": "500",
     "503": "503",
 
+    "info":"个人信息",
+    "edit_password":"修改密码",
+    "logout":"退出",
+    "goods_tips":"该商品库存不足!",
     "logIn": "登录",
     "username": "请输入管理员名称",
     "password": "请输入管理员密码",

+ 51 - 48
src/views/stock/addInventory.vue

@@ -9,12 +9,12 @@
       >
         {{ goodsExchangeAddForm.sn }}
       </el-form-item>
-      <el-form-item prop="warehouse_id" label="入库仓库:" class="change-form-item">
+      <el-form-item prop="warehouse_id" :label="$t('warehousing')+$t('warechouse')+':'" class="change-form-item">
         <el-select v-model="goodsExchangeAddForm.warehouse_id" clearable :disabled="type === 'view'">
           <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
         </el-select>
       </el-form-item>
-      <el-form-item label="类型:" prop="type" class="change-form-item">
+      <el-form-item :label="$t('type')+':'" prop="type" class="change-form-item">
         <el-select
           v-model="goodsExchangeAddForm.type"
           filterable
@@ -32,19 +32,19 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="备注:" prop="change_desc" class="change-form-item" style="width: 61%">
+      <el-form-item :label="$t('notes')+':'" prop="change_desc" class="change-form-item" style="width: 61%">
         <el-input
           style="flex: 1"
           v-model="goodsExchangeAddForm.memo"
           type="textarea"
           :disabled="type === 'view' || type === 'audit'"
           :autosize="{ minRows: 3, maxRows: 4 }"
-          placeholder="请输入"
+          :placeholder="$t('place')"
         ></el-input>
       </el-form-item>
       <div class="mx">
-        <h3>商品明细:</h3>
-        <el-button class="button" size="mini" type="primary" v-if="type !== 'view' && type !== 'audit'" @click="scanCode">扫码入库</el-button>
+        <h3>{{$t('goods_inventory')}}:</h3>
+        <el-button class="button" size="mini" type="primary" v-if="type !== 'view' && type !== 'audit'" @click="scanCode">{{$t('scan_code')}}</el-button>
         <el-button
           class="button"
           size="mini"
@@ -57,7 +57,7 @@
             goodsExchangeAddForm.type !== 'SALE_AFTER'
           "
           @click="handleSelectWarehouseEntryBatch"
-          >选择</el-button
+          >{{$t('select')}}</el-button
         >
       </div>
       <div style="width: 100%; display: block">
@@ -69,7 +69,7 @@
             :header-cell-style="{ textAlign: 'center' }"
             style="width: 100%; margin-top: 20px"
           >
-            <el-table-column label="库位号">
+            <el-table-column :label="$t('warechouse_code')">
               <template #default="scope">
                 <el-popover placement="right" trigger="click" v-if="scope.row.area_stock_list">
                   <div>
@@ -84,7 +84,7 @@
                 {{ scope.row.goods_vo.sn }}
               </template>
             </el-table-column> -->
-            <el-table-column label="商品名称">
+            <el-table-column :label="$t('goods_name')">
               <template #default="scope">
                 {{ scope.row.product_vo.name }}
               </template>
@@ -107,14 +107,14 @@
             </el-table-column> -->
             <!-- <el-table-column prop="product_vo.spec_name" label="规格型号" v-if="id"> </el-table-column>
             <el-table-column prop="product_vo.spec_name" label="规格型号" v-else> </el-table-column> -->
-            <el-table-column label="单位">
+            <el-table-column :label="$t('goods_unit')">
               <template #default="scope">
                 {{ scope.row.product_vo.unit }}
                 <!--    <span v-if="id">{{ scope.row.product_vo.unit }}</span>
                 <span v-else>{{ scope.row.product_vo.unit }}</span> -->
               </template>
             </el-table-column>
-            <el-table-column label="入库数量">
+            <el-table-column :label="$t('warehousing_num')">
               <template #default="scope">
                 <el-input-number
                   v-model="scope.row.num"
@@ -133,7 +133,7 @@
             </el-table-column>
             <el-table-column
               prop="entry_num"
-              label="已入库数量"
+              :label="$t('warehousing_in_num')"
               v-if="goodsExchangeAddForm.type == 'TRANSFER_ENTRY' || goodsExchangeAddForm.type == 'HAIL_ENTRY' || goodsExchangeAddForm.type == 'SALE_AFTER'"
             >
               <template #default="scope">
@@ -142,7 +142,7 @@
             </el-table-column>
             <el-table-column
               prop="not_entry_num"
-              label="未入库数量"
+              :label="$t('not_entry_num')"
               v-if="goodsExchangeAddForm.type == 'TRANSFER_ENTRY' || goodsExchangeAddForm.type == 'HAIL_ENTRY' || goodsExchangeAddForm.type == 'SALE_AFTER'"
             >
               <template #default="scope">
@@ -150,30 +150,30 @@
               </template>
             </el-table-column>
             <el-table-column
-              label="订单数量"
+              :label="$t('order_num')"
               v-if="goodsExchangeAddForm.type == 'HAIL_ENTRY' || goodsExchangeAddForm.type == 'SALE_AFTER' || goodsExchangeAddForm.type == 'TRANSFER_ENTRY'"
             >
               <template #default="scope">
                 {{ scope.row.order_num }}
               </template>
             </el-table-column>
-            <el-table-column label="退货数量" v-if="goodsExchangeAddForm.type == 'SALE_AFTER'">
+            <el-table-column :label="$t('return_num')" v-if="goodsExchangeAddForm.type == 'SALE_AFTER'">
               <template #default="scope">
                 {{ scope.row.return_num }}
               </template>
             </el-table-column>
-            <el-table-column label="在途库存" v-if="TO_BE_RETURN == 'TO_BE_RETURN'">
+            <el-table-column :label="$t('transit_stock')" v-if="TO_BE_RETURN == 'TO_BE_RETURN'">
               <template #default="scope">
                 {{ scope.row.stock_num }}
               </template>
             </el-table-column>
-            <el-table-column label="差异" v-if="id">
+            <el-table-column :label="$t('diff')" v-if="id">
               <template #default="scope">
                 <span v-if="scope.row.order_num">{{ scope.row.num - scope.row.order_num || 0 }}</span>
               </template>
             </el-table-column>
             <el-table-column
-              label="操作"
+              :label="$t('operate')"
               v-if="
                 type !== 'view' &&
                 type !== 'audit' &&
@@ -183,7 +183,7 @@
               "
             >
               <template #default="scope">
-                <el-button size="mini" type="danger" @click="goodsExchangeAddForm.product_list.splice(scope.$index, 1)">删除</el-button>
+                <el-button size="mini" type="danger" @click="goodsExchangeAddForm.product_list.splice(scope.$index, 1)">{{$t('delete')}}</el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -202,26 +202,26 @@
         "
         type="primary"
         @click="savegoodsExchangeAddForm"
-        >保存
+        >{{$t('save')}}
       </el-button>
       <el-button v-if="type !== 'view' && type !== 'detail' && checkPermission(['warehouseEntry:update'])" type="primary" @click="submitgoodsExchangeAddForm"
-        >入库
+        >{{$t('warehousing')}}
       </el-button>
-      <el-button @click="printIng" v-if="type == 'audit'">打印</el-button>
-      <el-button @click="toBack()">返回</el-button>
+      <el-button @click="printIng" v-if="type == 'audit'">{{$t('print')}}</el-button>
+      <el-button @click="toBack()">{{$t('return')}}</el-button>
     </div>
-    <el-dialog title="提示" v-model="dialogVisible" width="30%">
+    <el-dialog :title="$t('prompt')" v-model="dialogVisible" width="30%">
       <el-form :model="goodsExchangeAddForm" label-width="120px" inline style="width: 900px">
-        <el-form-item label="驳回原因" prop="reject_reason">
+        <el-form-item :label="$t('reject')" prop="reject_reason">
           <el-input v-model="goodsExchangeAddForm.reject_reason" type="textarea" :minlength="0" :maxlength="100"></el-input>
         </el-form-item>
       </el-form>
       <template #footer>
-        <el-button @click="dialogVisible = false">取 消</el-button>
-        <el-button type="primary" @click="handleRejectGoodsExchange()">确 定</el-button>
+        <el-button @click="dialogVisible = false">{{$t('cancel')}}</el-button>
+        <el-button type="primary" @click="handleRejectGoodsExchange()">{{$t('submit')}}</el-button>
       </template>
     </el-dialog>
-    <el-dialog title="扫码入库" v-model="scanDialogVisible" width="30%" :close-on-click-modal="false">
+    <el-dialog :title="$t('scan_code')" v-model="scanDialogVisible" width="30%" :close-on-click-modal="false">
       <el-form ref="scanGoodsFormRef" :model="scanGoodsForm" label-width="120px" inline>
         <el-form-item label="sku" prop="bar_code">
           <el-input v-model="scanGoodsForm.bar_code" ref="inputRef" @keyup.enter="toSearch()" :minlength="0" :maxlength="100"></el-input>
@@ -231,22 +231,22 @@
         </el-form-item>
       </el-form>
     </el-dialog>
-    <el-dialog title="入库商品" v-model="goodsVisible" width="1000px" @close="closeGoosData">
+    <el-dialog :title="$t('warehousing')+$t('goods_info')" v-model="goodsVisible" width="1000px" @close="closeGoosData">
       <div style="display: flex; align-items: center; justify-content: flex-end; padding: 10px 0">
-        <span>搜索商品:</span><el-input v-model="params.keyWord" style="width: 200px; margin-right: 5px"></el-input>
-        <el-button @click="searchGoodEvent"> 搜索 </el-button>
+        <span>{{$t('search')+$t('goods_info')}}:</span><el-input v-model="params.keyWord" style="width: 200px; margin-right: 5px"></el-input>
+        <el-button @click="searchGoodEvent"> {{$t('search')}} </el-button>
       </div>
       <el-table :data="goodsData.records" border style="width: 100%" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" />
-        <el-table-column prop="product_vo.name" label="商品名称"></el-table-column>
+        <el-table-column prop="product_vo.name" :label="$t('goods_name')"></el-table-column>
         <el-table-column prop="product_vo.sku" label="sku"> </el-table-column>
-        <el-table-column prop="" label="品牌">
+        <el-table-column prop="" :label="$t('brand')">
           <template #default="scope">
             {{ scope.row.product_vo.brand }}
           </template>
         </el-table-column>
-        <el-table-column prop="product_vo.weight" label="重量"> </el-table-column>
-        <el-table-column prop="product_vo.unit" label="单位"> </el-table-column>
+        <el-table-column prop="product_vo.weight" :label="$t('weight')"> </el-table-column>
+        <el-table-column prop="product_vo.unit" :label="$t('goods_unit')"> </el-table-column>
       </el-table>
       <el-pagination
         @size-change="goodsPageSizeChange"
@@ -259,8 +259,8 @@
       >
       </el-pagination>
       <template #footer>
-        <el-button @click="closeGoosData">取 消</el-button>
-        <el-button type="primary" @click="submitGoosData()">确 定</el-button>
+        <el-button @click="closeGoosData">{{$t('cancel')}}</el-button>
+        <el-button type="primary" @click="submitGoosData()">{{$t('submit')}}</el-button>
       </template>
     </el-dialog>
     <el-dialog title="订单列表" v-model="orderVisible" width="1000px" @close="closeGoosData">
@@ -317,6 +317,9 @@ import * as API_BasicSetting from '@/api/basicSetting';
   import * as API_order from '@/api/order';
   import * as API_Goods from '@/api/goods';
   import * as API_CollectingAccount from '@/api/collectingAccount'; */
+  import { useI18n } from 'vue-i18n';
+
+const { t } = useI18n();
 
 const store = useStore();
 const route = useRoute();
@@ -341,8 +344,8 @@ let goodsExchangeAddForm = reactive({
 });
 
 const goodsExchangeAddFormRule = {
-  warehouse_id: [{ required: true, message: '请选择入库仓库', trigger: 'change' }],
-  type: [{ required: true, message: '请选择入库类型', trigger: 'change' }],
+  warehouse_id: [{ required: true, message: t('change')+t('warehousing')+t('warechouse'), trigger: 'change' }],
+  type: [{ required: true, message: t('change')+t('warehousing')+t('type'), trigger: 'change' }],
 };
 
 const params = reactive({
@@ -519,7 +522,7 @@ const submitGoosData = () => {
     });
     goodsVisible.value = false;
   } else {
-    ElMessage.error('请选择商品信息');
+    ElMessage.error(t('change')+t('goods_info')+'!');
   }
 };
 
@@ -530,7 +533,7 @@ const closeGoosData = () => {
 const inputRef = ref();
 const scanCode = () => {
   if (!goodsExchangeAddForm.warehouse_id) {
-    ElMessage.error('请先选择仓库!');
+    ElMessage.error(t('change')+t('warechouse')+'!');
     return;
   }
   scanDialogVisible.value = true;
@@ -541,7 +544,7 @@ const scanCode = () => {
 
 const handleSelectWarehouseEntryBatch = () => {
   if (!goodsExchangeAddForm.warehouse_id) {
-    ElMessage.error('请先选择仓库!');
+    ElMessage.error(t('change')+t('warechouse')+'!');
     return;
   }
   API_GoodsExchange.getGoodsInfo(params, goodsExchangeAddForm.warehouse_id, 'le').then((res) => {
@@ -556,7 +559,7 @@ const savegoodsExchangeAddForm = () => {
       const params = { ...goodsExchangeAddForm };
       params.save_or_submit = 'save';
       if (!params.product_list.length) {
-        ElMessage.error('请选择商品!');
+        ElMessage.error(t('change')+t('goods_info')+'!');
         return;
       }
       params.product_list.forEach((el) => {
@@ -566,12 +569,12 @@ const savegoodsExchangeAddForm = () => {
       });
       if (type.value == 'edit') {
         API_GoodsExchange.editWarehouseEntry(route.query.id, params).then((response) => {
-          ElMessage.success('修改成功!');
+          ElMessage.success(t('edit_success')+'!');
           router.push({ name: 'goodsExchange' });
         });
       } else {
         API_GoodsExchange.warehouseEntry(params).then(() => {
-          ElMessage.success('保存成功!');
+          ElMessage.success(t('sub_success')+'!');
           router.push({ name: 'goodsExchange' });
         });
       }
@@ -585,7 +588,7 @@ const submitgoodsExchangeAddForm = () => {
       const params = { ...goodsExchangeAddForm };
       params.save_or_submit = 'submit';
       if (!params.product_list.length) {
-        ElMessage.error('请选择商品!');
+        ElMessage.error(t('change')+t('goods_info')+'!');
         return;
       }
       params.product_list.forEach((el) => {
@@ -595,12 +598,12 @@ const submitgoodsExchangeAddForm = () => {
       });
       if (type.value == 'edit') {
         API_GoodsExchange.editWarehouseEntry(route.query.id, params).then((response) => {
-          ElMessage.success('修改成功!');
+          ElMessage.success(t('edit_success')+'!');
           router.push({ name: 'goodsExchange' });
         });
       } else {
         API_GoodsExchange.warehouseEntry(params).then(() => {
-          ElMessage.success('保存成功!');
+          ElMessage.success(t('sub_success')+'!');
           router.push({ name: 'goodsExchange' });
         });
       }

+ 52 - 50
src/views/stock/addOutbound.vue

@@ -1,12 +1,12 @@
 <template>
   <div class="bg-in-stock">
     <el-form ref="goodsExchangeAddFormRef" :model="goodsExchangeAddForm" :rules="goodsExchangeAddFormRule" label-width="160px" inline class="change-form">
-      <el-form-item prop="warehouse_id" label="出库仓库" class="change-form-item">
+      <el-form-item prop="warehouse_id" :label="$t('outBound')+$t('warechouse')" class="change-form-item">
         <el-select v-model="goodsExchangeAddForm.warehouse_id" :disabled="type === 'view' || type === 'audit'">
           <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
         </el-select>
       </el-form-item>
-      <el-form-item label="类型" prop="type" class="change-form-item">
+      <el-form-item :label="$t('type')" prop="type" class="change-form-item">
         <el-select v-model="goodsExchangeAddForm.type" filterable allow-create clearable default-first-option :disabled="type === 'view' || type === 'audit'">
           <el-option
             v-for="item in typeList"
@@ -17,7 +17,7 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="备注" prop="notes" class="change-form-item" style="width: 61%">
+      <el-form-item :label="$t('notes')" prop="notes" class="change-form-item" style="width: 61%">
         <el-input
           style="flex: 1"
           v-model="goodsExchangeAddForm.notes"
@@ -25,14 +25,14 @@
           :disabled="type === 'view' || type === 'audit'"
           maxlength="250"
           :autosize="{ minRows: 3, maxRows: 4 }"
-          placeholder="请输入"
+          :laceholder="$t('place')"
         ></el-input>
       </el-form-item>
       <div class="mx">
-        <h3>商品明细</h3>
-        <el-button class="button" size="mini" type="primary" v-if="type !== 'view' && type !== 'audit'" @click="scanCode">扫码出库</el-button>
+        <h3>{{$t('goods_inventory')}}</h3>
+        <el-button class="button" size="mini" type="primary" v-if="type !== 'view' && type !== 'audit'" @click="scanCode">{{$t('scan_code')}}</el-button>
         <el-button class="button" size="mini" type="primary" v-if="type !== 'view' && type !== 'audit'" @click="handleSelectWarehouseEntryBatch"
-          >选择</el-button
+          >{{$t('select')}}</el-button
         >
       </div>
       <div style="width: 100%; display: block">
@@ -44,7 +44,7 @@
             :header-cell-style="{ textAlign: 'center' }"
             style="width: 100%; margin-top: 20px"
           >
-            <el-table-column label="库位号">
+            <el-table-column :label="$t('warechouse_code')">
               <template #default="scope">
                 <el-popover placement="right" trigger="click" v-if="scope.row.area_stock_list">
                   <div>
@@ -60,7 +60,7 @@
                 <span v-else>{{ scope.row.goods_vo.sn }}</span>
               </template>
             </el-table-column> -->
-            <el-table-column label="商品名称">
+            <el-table-column :label="$t('goods_name')">
               <template #default="scope">
                 <span v-if="id">{{ scope.row.product_vo.name }}</span>
                 <span v-else>{{ scope.row.product_vo.name }}</span>
@@ -83,14 +83,14 @@
             </el-table-column> 
             <el-table-column prop="product_vo.spec_name" label="规格型号" v-if="id"> </el-table-column>
             <el-table-column prop="product_vo.spec_name" label="规格型号" v-else> </el-table-column>-->
-            <el-table-column label="单位">
+            <el-table-column :label="$t('goods_unit')">
               <template #default="scope">
                 {{ scope.row.product_vo.unit }}
                 <!--  <span v-if="id">{{ scope.row.product_vo.unit }}</span>
                 <span v-else>{{ scope.row.product_vo.unit }}</span> -->
               </template>
             </el-table-column>
-            <el-table-column label="出库数量">
+            <el-table-column :label="$t('out_num')">
               <template #default="scope">
                 <el-input v-model="scope.row.out_num" type="number" :min="0" :maxlength="20" :disabled="type === 'view' || type === 'audit'"></el-input>
               </template>
@@ -100,48 +100,48 @@
                 {{ scope.row.order_num }}
               </template>
             </el-table-column> -->
-            <el-table-column label="可用库存">
+            <el-table-column :label="$t('usable_stock')">
               <template #default="scope">
                 {{ scope.row.usable_stock }}
               </template>
             </el-table-column>
-            <el-table-column label="实际库存">
+            <el-table-column :label="$t('actual_stock')">
               <template #default="scope">
                 {{ scope.row.actual_stock }}
               </template>
             </el-table-column>
-            <el-table-column width="200" label="操作" v-if="type !== 'view' && type !== 'audit'">
+            <el-table-column width="200" :label="$t('operate')" v-if="type !== 'view' && type !== 'audit'">
               <template #default="scope">
-                <el-button size="mini" type="danger" @click="goodsExchangeAddForm.product_list.splice(scope.$index, 1)">删除</el-button>
+                <el-button size="mini" type="danger" @click="goodsExchangeAddForm.product_list.splice(scope.$index, 1)">{{$t('delete')}}</el-button>
               </template>
             </el-table-column>
           </el-table>
         </el-form-item>
       </div>
     </el-form>
-    <div class="footer">
-      <el-button v-if="type !== 'audit' && type !== 'view' && checkPermission(['warehouseOut2:add'])" type="primary" @click="saveGoodsExchangeAddForm"
-        >保存
+    <div class="footer"><!-- && checkPermission(['warehouseOut2:add']) -->
+      <el-button v-if="type !== 'audit' && type !== 'view' " type="primary" @click="saveGoodsExchangeAddForm"
+        >{{$t('save')}}
+      </el-button><!--  && checkPermission(['warehouseOut:update']) -->
+      <el-button v-if="type !== 'audit' && type !== 'view'" type="primary" @click="submitGoodsExchangeAddForm"
+        >{{$t('outBound')}}
       </el-button>
-      <el-button v-if="type !== 'audit' && type !== 'view' && checkPermission(['warehouseOut:update'])" type="primary" @click="submitGoodsExchangeAddForm"
-        >出库
-      </el-button>
-      <el-button @click="printIng" v-if="type == 'audit'">打印</el-button>
-      <el-button @click="toBack()">返回</el-button>
+      <el-button @click="printIng" v-if="type == 'audit'">{{$t('print')}}</el-button>
+      <el-button @click="toBack()">{{$t('return')}}</el-button>
     </div>
 
-    <el-dialog title="提示" v-model:visible="dialogVisible" width="30%">
+    <el-dialog :title="$t('prompt')" v-model:visible="dialogVisible" width="30%">
       <el-form ref="goodsExchangeAddForm" :model="goodsExchangeAddForm" label-width="120px" inline style="width: 900px">
-        <el-form-item label="驳回原因" prop="reject_reason">
+        <el-form-item :label="$t('reject')" prop="reject_reason">
           <el-input v-model="goodsExchangeAddForm.reject_reason" type="textarea" :minlength="0" :maxlength="100"></el-input>
         </el-form-item>
       </el-form>
       <template #footer>
-        <el-button @click="dialogVisible = false">取 消</el-button>
-        <el-button type="primary" @click="handleRejectGoodsExchange()">确 定</el-button>
+        <el-button @click="dialogVisible = false">{{$t('cancel')}}</el-button>
+        <el-button type="primary" @click="handleRejectGoodsExchange()">{{$t('submit')}}</el-button>
       </template>
     </el-dialog>
-    <el-dialog title="扫码出库" v-model:visible="scanDialogVisible" width="30%" :close-on-click-modal="false">
+    <el-dialog :title="$t('out_code')" v-model:visible="scanDialogVisible" width="30%" :close-on-click-modal="false">
       <el-form ref="scanGoodsForm" :model="scanGoodsForm" label-width="120px" inline>
         <el-form-item label="sku" prop="bar_code">
           <el-input v-model="scanGoodsForm.bar_code" ref="input" @keyup.enter="toSearch()" :minlength="0" :maxlength="100"></el-input>
@@ -151,22 +151,22 @@
         </el-form-item>
       </el-form>
     </el-dialog>
-    <el-dialog title="出库商品" v-model="goodsVisible" width="1000px" @close="closeGoosData">
+    <el-dialog :title="$t('outBound')+$t('goods_info')" v-model="goodsVisible" width="1000px" @close="closeGoosData">
       <div style="display: flex; align-items: center; justify-content: flex-end; padding: 10px 0">
-        <span>搜索商品:</span><el-input v-model="params.keyWord" style="width: 200px; margin-right: 5px"></el-input>
-        <el-button @click="searchGoodEvent"> 搜索 </el-button>
+        <span>{{$t('search')+$t('goods_info')}}:</span><el-input v-model="params.keyWord" style="width: 200px; margin-right: 5px"></el-input>
+        <el-button @click="searchGoodEvent"> {{$t('search')}} </el-button>
       </div>
       <el-table :data="goodsData.records" border style="width: 100%" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" />
-        <el-table-column prop="product_vo.name" label="商品名称"></el-table-column>
+        <el-table-column prop="product_vo.name" :label="$t('goods_name')"></el-table-column>
         <el-table-column prop="product_vo.sku" label="sku"> </el-table-column>
-        <el-table-column prop="" label="品牌">
+        <el-table-column prop="" :label="$t('brand')">
           <template #default="scope">
             {{ scope.row.product_vo.brand }}
           </template>
         </el-table-column>
-        <el-table-column prop="product_vo.weight" label="重量"> </el-table-column>
-        <el-table-column prop="product_vo.unit" label="单位"> </el-table-column>
+        <el-table-column prop="product_vo.weight" :label="$t('weight')"> </el-table-column>
+        <el-table-column prop="product_vo.unit" :label="$t('goods_unit')"> </el-table-column>
       </el-table>
       <el-pagination
         @size-change="goodsPageSizeChange"
@@ -179,8 +179,8 @@
       >
       </el-pagination>
       <template #footer>
-        <el-button @click="closeGoosData">取 消</el-button>
-        <el-button type="primary" @click="submitGoosData()">确 定</el-button>
+        <el-button @click="closeGoosData">{{$t('cancel')}}</el-button>
+        <el-button type="primary" @click="submitGoosData()">{{$t('submit')}}</el-button>
       </template>
     </el-dialog>
   </div>
@@ -194,6 +194,9 @@ import * as API_Setting from '@/api/setting';
 import * as API_BasicSetting from '@/api/basicSetting';
 import { useRoute, useRouter } from 'vue-router';
 import { ElMessageBox, ElMessage } from 'element-plus';
+import { useI18n } from 'vue-i18n';
+
+const { t } = useI18n();
 
 const route = useRoute();
 const router = useRouter();
@@ -232,8 +235,8 @@ const goodsExchangeAddForm = ref({
   type: '',
 });
 const goodsExchangeAddFormRule = ref({
-  warehouse_id: [{ required: true, message: '请选择出库仓库', trigger: 'change' }],
-  type: [{ required: true, message: '请选择出库类型', trigger: 'change' }],
+  warehouse_id: [{ required: true, message: t('change')+t('outBound')+t('warechouse'), trigger: 'change' }],
+  type: [{ required: true, message: t('change')+t('outBound')+t('type'), trigger: 'change' }],
 });
 const typeList = ref([]);
 const adminList = ref([]);
@@ -342,7 +345,7 @@ const toSearch = () => {
 
 const scanCode = () => {
   if (!goodsExchangeAddForm.value.warehouse_id) {
-    ElMessage.error('请先选择仓库!');
+    ElMessage.error(t('change')+t('warechouse')+'!');
     return;
   }
   scanDialogVisible.value = true;
@@ -369,7 +372,6 @@ const GET_WarehouseList = (e) => {
 
 const goodsExchangeAddFormRef = ref();
 const saveGoodsExchangeAddForm = () => {
-  console.log(112);
   goodsExchangeAddFormRef.value.validate((valid) => {
     if (valid) {
       const { id } = goodsExchangeAddForm.value;
@@ -392,7 +394,7 @@ const saveGoodsExchangeAddForm = () => {
       if (params.type == 'OTHER_OUT' || params.type == 'BORROW_OUT') {
         const isStockSufficient = params.product_list.map((el) => {
           if (el.out_num > el.usable_stock) {
-            ElMessage.error('该商品库存不足!');
+            ElMessage.error(t('goods_tips'));
             return false;
           }
           return true;
@@ -403,7 +405,7 @@ const saveGoodsExchangeAddForm = () => {
       }
       if (type.value == 'edit') {
         API_GoodsExchange.editWarehouseOut(id, params).then((response) => {
-          ElMessage.success('修改成功!');
+          ElMessage.success(t('edit_success')+'!');
           /* const { callback } = this.$route.params;
           if (typeof callback === 'function') callback();
           store.dispatch('delCurrentViews', {
@@ -419,7 +421,7 @@ const saveGoodsExchangeAddForm = () => {
           el.id = '';
         });
         API_GoodsExchange.warehouseOut(params).then(() => {
-          ElMessage.success('添加成功!');
+          ElMessage.success(t('add_success')+'!');
           /* const { callback } = this.$route.params;
           if (typeof callback === 'function') callback();
           store.dispatch('delCurrentViews', {
@@ -450,13 +452,13 @@ const submitGoodsExchangeAddForm = () => {
       }
       params.change_time = Math.floor(params.change_time / 1000);
       if (!goodsExchangeAddForm.value.product_list.length) {
-        ElMessage.error('请选择商品!');
+        ElMessage.error(t('change')+t('goods_info')+'!');
         return;
       }
       if (params.type == 'OTHER_OUT' || params.type == 'BORROW_OUT') {
         const isStockSufficient = params.product_list.map((el) => {
           if (el.out_num > el.usable_stock) {
-            ElMessage.error('该商品库存不足!');
+            ElMessage.error(t('goods_tips'));
             return false;
           }
           return true;
@@ -467,7 +469,7 @@ const submitGoodsExchangeAddForm = () => {
       }
       if (type.value == 'edit') {
         API_GoodsExchange.editWarehouseOut(id, params).then((response) => {
-          ElMessage.success('修改成功!');
+          ElMessage.success(t('edit_success')+'!');
           /* const { callback } = this.$route.params;
           if (typeof callback === 'function') callback();
           store.dispatch('delCurrentViews', {
@@ -482,7 +484,7 @@ const submitGoodsExchangeAddForm = () => {
           el.id = '';
         });
         API_GoodsExchange.warehouseOut(params).then(() => {
-          ElMessage.success('添加成功!');
+          ElMessage.success(t('add_success')+'!');
           /* const { callback } = this.$route.params;
           if (typeof callback === 'function') callback();
           store.dispatch('delCurrentViews', {
@@ -509,7 +511,7 @@ const params = reactive({
 });
 const handleSelectWarehouseEntryBatch = async () => {
   if (!goodsExchangeAddForm.value.warehouse_id) {
-    ElMessage.error('请先选择仓库!');
+    ElMessage.error(t('change')+t('warechouse')+'!');
     return;
   }
   API_GoodsExchange.getGoodsInfo(params, goodsExchangeAddForm.value.warehouse_id, 'gt').then((res) => {
@@ -531,7 +533,7 @@ const submitGoosData = () => {
     });
     goodsVisible.value = false;
   } else {
-    ElMessage.error('请选择商品信息');
+    ElMessage.error(t('change')+t('goods_info')+'!');
   }
 };
 const goodsPageSizeChange = (size) => {

+ 61 - 58
src/views/stock/goodsInventoryAdd.vue

@@ -1,11 +1,11 @@
 <template>
   <div class="bg-in-stock" v-loading="loading">
     <el-form ref="goodsInventoryAddFormRef" :model="goodsInventoryAddForm" :rules="goodsInventoryAddFormRule" label-width="120px" inline class="change-form">
-      <h3 style="width: 100%">盘点单</h3>
-      <el-form-item label="盘点编号" prop="sn" v-if="type === 'edit' || type === 'view'" class="change-form-item">
+      <h3 style="width: 100%">{{ $t('inventory') }}</h3>
+      <el-form-item :label="$t('inventorySn')" prop="sn" v-if="type === 'edit' || type === 'view'" class="change-form-item">
         <el-input v-model="goodsInventoryAddForm.sn" :disabled="true"></el-input>
       </el-form-item>
-      <el-form-item label="盘点时间" prop="inventory_time" class="change-form-item">
+      <el-form-item :label="$t('inventory_time')" prop="inventory_time" class="change-form-item">
         <span v-if="id && type !== 'edit'">{{ goodsInventoryAddForm.inventory_time }}</span>
         <el-date-picker
           v-else
@@ -14,11 +14,11 @@
           value-format="YYYY-MM-DD HH:mm:ss"
           type="datetime"
           :disabled="type === 'detail' || type === 'audit' || type === 'check'"
-          placeholder="选择日期时间"
+          :placeholder="$t('change') + $t('date')"
         >
         </el-date-picker>
       </el-form-item>
-      <el-form-item label="仓库" prop="warehouse_id" class="change-form-item">
+      <el-form-item :label="$t('warechouse')" prop="warehouse_id" class="change-form-item">
         <span v-if="id && type !== 'edit'">{{ getWarehouse(goodsInventoryAddForm.warehouse_id) }}</span>
         <el-select
           v-else
@@ -29,7 +29,7 @@
           <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
         </el-select>
       </el-form-item>
-      <el-form-item label="盘点人" prop="inventory_person_id" class="change-form-item">
+      <el-form-item :label="$t('inventoryPeople')" prop="inventory_person_id" class="change-form-item">
         <span v-if="id && type !== 'edit'">{{ getadminList(goodsInventoryAddForm.inventory_person_id) }}</span>
         <el-select
           v-else
@@ -40,7 +40,7 @@
           <el-option v-for="item in adminList" :key="item.id" :label="item.nickname" :value="item.id" />
         </el-select>
       </el-form-item>
-      <el-form-item label="制单人" prop="creator_id" class="change-form-item">
+      <el-form-item :label="$t('creator')" prop="creator_id" class="change-form-item">
         <span v-if="id && type !== 'edit'">{{ getadminList(goodsInventoryAddForm.creator_id) }}</span>
         <el-select
           v-else
@@ -51,7 +51,7 @@
           <el-option v-for="item in adminList" :key="item.id" :label="item.nickname" :value="item.id" />
         </el-select>
       </el-form-item>
-      <el-form-item label="盘点类型" prop="inventory_type" class="change-form-item">
+      <el-form-item :label="$t('inventoryType')" prop="inventory_type" class="change-form-item">
         <span v-if="id && type !== 'edit'">{{ getRoleSplit(goodsInventoryAddForm.inventory_type) }}</span>
         <el-select
           v-else
@@ -62,18 +62,18 @@
           <el-option v-for="item in typeList" :key="item.id" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
-      <el-form-item label="是否通知审核人:" prop="has_notice" class="change-form-item">
+      <el-form-item :label="$t('notifiedre') + ':'" prop="has_notice" class="change-form-item">
         <el-switch v-model="goodsInventoryAddForm.has_notice" :disabled="type === 'view'" inline-prompt :active-text="true" :inactive-text="false" />
       </el-form-item>
-      <el-form-item label="审核人:" prop="notice_user_id" class="change-form-item" v-if="goodsInventoryAddForm.has_notice">
+      <el-form-item :label="$t('reviewer') + ':'" prop="notice_user_id" class="change-form-item" v-if="goodsInventoryAddForm.has_notice">
         <span v-if="id && type !== 'edit'">{{ getNotice(goodsInventoryAddForm.notice_user_id) }}</span>
         <el-select v-else v-model="goodsInventoryAddForm.notice_user_id" :disabled="type === 'detail' || type === 'audit' || type === 'view'">
           <el-option v-for="item in auditList" :key="item.id" :label="item.nickname" :value="item.id" />
         </el-select>
       </el-form-item>
       <div class="mx">
-        <h3>商品明细</h3>
-        <el-button class="button" size="mini" type="primary" v-if="type !== 'detail' && type !== 'view'" @click="scanCode">商品扫码</el-button>
+        <h3>{{ $t('goods_inventory') }}</h3>
+        <el-button class="button" size="mini" type="primary" v-if="type !== 'detail' && type !== 'view'" @click="scanCode">{{$t('goods_code')}}</el-button>
         <el-button
           class="button"
           size="mini"
@@ -81,7 +81,7 @@
           v-if="type !== 'detail' && type !== 'view'"
           @click="handleSelectWarehouseEntryBatch"
           :disabled="selectBtn"
-          >选择</el-button
+          >{{$t('select')}}</el-button
         >
       </div>
       <div style="width: 100%; display: block">
@@ -94,7 +94,7 @@
             :loading="loading"
             style="width: 100%; margin-top: 20px"
           >
-            <el-table-column label="库位号">
+            <el-table-column :label="$t('warechouse_code')">
               <template #default="scope">
                 <el-popover placement="right" trigger="click" v-if="scope.row.area_stock_list">
                   <div>
@@ -105,7 +105,7 @@
                       {{ scope.row.area_stock_list[0].warehouse_area_name }}
                     </span>
                   </template>
-                 <!--  <span slot="reference" v-if="scope.row.area_stock_list.length !== 0">{{ scope.row.area_stock_list[0].warehouse_area_name }}</span> -->
+                  <!--  <span slot="reference" v-if="scope.row.area_stock_list.length !== 0">{{ scope.row.area_stock_list[0].warehouse_area_name }}</span> -->
                 </el-popover>
               </template>
             </el-table-column>
@@ -115,7 +115,7 @@
                 <span v-else>{{ scope.row.product_vo.sn }}</span>
               </template>
             </el-table-column> -->
-            <el-table-column label="商品名称">
+            <el-table-column :label="$t('goods_name')">
               <template #default="scope">
                 <span v-if="id">{{ scope.row.product_vo.name }}</span>
                 <span v-else>{{ scope.row.product_vo.name }}</span>
@@ -137,18 +137,18 @@
               </template>
             </el-table-column>
             <el-table-column prop="product_vo.spec_name" label="规格型号"> </el-table-column> -->
-            <el-table-column label="单位">
+            <el-table-column :label="$t('goods_unit')">
               <template #default="scope">
                 <span v-if="!id"> {{ scope.row.product_vo.unit }}</span>
                 <span v-else> {{ scope.row.product_vo.unit }}</span>
               </template>
             </el-table-column>
-            <el-table-column label="库存数量">
+            <el-table-column :label="$t('stock')">
               <template #default="scope">
                 {{ scope.row.actual_stock }}
               </template>
             </el-table-column>
-            <el-table-column label="盘点数量">
+            <el-table-column :label="$t('inventory_num')">
               <template #default="scope">
                 <span v-if="type === 'view'">{{ scope.row.inventory_num }}</span>
                 <el-input
@@ -161,14 +161,14 @@
                 ></el-input>
               </template>
             </el-table-column>
-            <el-table-column label="差异">
+            <el-table-column :label="$t('diff')">
               <template #default="scope">
                 {{ scope.row.inventory_num - scope.row.actual_stock || 0 }}
               </template>
             </el-table-column>
-            <el-table-column label="操作" v-if="type !== 'detail' && type !== 'audit' && type !== 'view'">
+            <el-table-column :label="$t('operate')" v-if="type !== 'detail' && type !== 'audit' && type !== 'view'">
               <template #default="scope">
-                <el-button size="mini" type="danger" @click="goodsInventoryAddForm.product_list.splice(scope.$index, 1)">删除</el-button>
+                <el-button size="mini" type="danger" @click="goodsInventoryAddForm.product_list.splice(scope.$index, 1)">{{$t('delete')}}</el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -176,11 +176,11 @@
       </div>
     </el-form>
     <div class="footer">
-      <el-button v-if="type !== 'audit' && type !== 'detail' && type !== 'view'" type="primary" @click="submitGoodsInventoryAddForm">保存 </el-button>
-      <el-button @click="printIng" v-if="type == 'check'">打印</el-button>
-      <el-button @click="$router.back()">返回 </el-button>
+      <el-button v-if="type !== 'audit' && type !== 'detail' && type !== 'view'" type="primary" @click="submitGoodsInventoryAddForm">{{$t('save')}} </el-button>
+      <el-button @click="printIng" v-if="type == 'check'">{{$t('print')}}</el-button>
+      <el-button @click="$router.back()">{{$t('return')}} </el-button>
     </div>
-    <el-dialog title="扫码入库" v-model="scanDialogVisible" width="30%" :close-on-click-modal="false">
+    <el-dialog :title="$t('goods_code')" v-model="scanDialogVisible" width="30%" :close-on-click-modal="false">
       <el-form ref="scanGoodsForm" :model="scanGoodsForm" label-width="120px" inline>
         <el-form-item label="sku" prop="bar_code">
           <el-input v-model="scanGoodsForm.bar_code" ref="input" @keyup.enter="toSearch()" :minlength="0" :maxlength="100"></el-input>
@@ -190,33 +190,33 @@
         </el-form-item>
       </el-form>
     </el-dialog>
-    <el-dialog title="提示" v-model="dialogVisible" width="30%">
+    <el-dialog :title="$t('prompt')" v-model="dialogVisible" width="30%">
       <el-form ref="goodsInventoryAddForm" :model="goodsInventoryAddForm" label-width="120px" inline style="width: 900px">
-        <el-form-item label="驳回原因" prop="reject_reason" required="true">
+        <el-form-item :label="$t('reject')" prop="reject_reason" required="true">
           <el-input v-model="goodsInventoryAddForm.reject_reason" type="textarea" :minlength="0" :maxlength="100"></el-input>
         </el-form-item>
       </el-form>
       <template #footer>
-        <el-button @click="dialogVisible = false">取 消</el-button>
-        <el-button type="primary" @click="handleRejectGoodsInventory()">确 定</el-button>
+        <el-button @click="dialogVisible = false">{{$t('cancel')}}</el-button>
+        <el-button type="primary" @click="handleRejectGoodsInventory()">{{$t('submit')}}</el-button>
       </template>
     </el-dialog>
-    <el-dialog title="盘点商品" v-model="goodsVisible" width="1000px" @close="closeGoosData">
+    <el-dialog :title="$t('inven')" v-model="goodsVisible" width="1000px" @close="closeGoosData">
       <div style="display: flex; align-items: center; justify-content: flex-end; padding: 10px 0">
-        <span>搜索商品:</span><el-input v-model="params.keyWord" style="width: 200px; margin-right: 5px"></el-input>
-        <el-button @click="searchGoodEvent"> 搜索 </el-button>
+        <span>{{$t('search')+$t('goods_info')}}:</span><el-input v-model="params.keyWord" style="width: 200px; margin-right: 5px"></el-input>
+        <el-button @click="searchGoodEvent"> {{$t('search')}} </el-button>
       </div>
       <el-table :data="goodsData.records" border style="width: 100%" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" />
-        <el-table-column prop="product_vo.name" label="商品名称"></el-table-column>
+        <el-table-column prop="product_vo.name" :label="$t('goods_name')"></el-table-column>
         <el-table-column prop="product_vo.sku" label="sku"> </el-table-column>
-        <el-table-column prop="" label="品牌">
+        <el-table-column prop="" :label="$t('brand')">
           <template #default="scope">
             {{ scope.row.product_vo.brand }}
           </template>
         </el-table-column>
-        <el-table-column prop="product_vo.weight" label="重量"> </el-table-column>
-        <el-table-column prop="product_vo.unit" label="单位"> </el-table-column>
+        <el-table-column prop="product_vo.weight" :label="$t('weight')"> </el-table-column>
+        <el-table-column prop="product_vo.unit" :label="$t('goods_unit')"> </el-table-column>
       </el-table>
       <el-pagination
         @size-change="goodsPageSizeChange"
@@ -229,8 +229,8 @@
       >
       </el-pagination>
       <template #footer>
-        <el-button @click="closeGoosData">取 消</el-button>
-        <el-button type="primary" @click="submitGoosData()">确 定</el-button>
+        <el-button @click="closeGoosData">{{$t('cancel')}}</el-button>
+        <el-button type="primary" @click="submitGoosData()">{{$t('submit')}}</el-button>
       </template>
     </el-dialog>
   </div>
@@ -247,6 +247,9 @@ import * as API_BasicSetting from '@/api/basicSetting';
 import * as API_Auth from '@/api/auth';
 import { useRouter, useRoute } from 'vue-router';
 import { ElMessage, ElMessageBox } from 'element-plus';
+import { useI18n } from 'vue-i18n';
+
+const { t } = useI18n();
 
 const router = useRouter();
 const route = useRoute();
@@ -268,10 +271,9 @@ const goodsInventoryAddForm = ref<any>({
   has_notice: false,
 });
 const goodsInventoryAddFormRule = ref({
-  inventory_person_id: { required: true, message: '请选择盘点人', trigger: 'change' },
-  warehouse_id: { required: true, message: '请选择报损仓库', trigger: 'change' },
-  dept_id: { required: true, message: '请选择所属部门', trigger: 'change' },
-  creator_id: { required: true, message: '请选择制单人', trigger: 'change' },
+  inventory_person_id: { required: true, message: t('change')+t('inventoryPeople'), trigger: 'change' },
+  warehouse_id: { required: true, message: t('change')+t('warechouse'), trigger: 'change' },
+  creator_id: { required: true, message:  t('change')+t('creator'), trigger: 'change' },
 });
 const warehouseProduct = ref(null);
 const typeList = ref<any>([]);
@@ -317,7 +319,7 @@ const submitGoosData = () => {
     });
     goodsVisible.value = false;
   } else {
-    ElMessage.error('请选择商品信息');
+    ElMessage.error(t('change')+t('goods_info'));
   }
 };
 /* 盘点商品分页 */
@@ -391,11 +393,12 @@ const handleChangeInventoryType = (val: string) => {
   goodsInventoryAddForm.value.product_list = [];
   if (val === 'ALL_INVENTORY') {
     if (!goodsInventoryAddForm.value.warehouse_id) {
-      store.dispatch('message/error', '请先选择仓库!');
+      store.dispatch('message/error', t('change')+t('warechouse')+'!');
       return;
     }
     loading.value = true;
-    API_GoodsExchange.getGoodsInfo(params, goodsInventoryAddForm.value.warehouse_id, 'le').then((res) => {
+    API_GoodsExchange.getGoodsInfo(params, goodsInventoryAddForm.value.warehouse_id, 'le')
+      .then((res) => {
         /* res.records.forEach((el) => {
           el.sn_code_list = [];
         }); */
@@ -463,11 +466,11 @@ const toSearch = () => {
 
 const scanCode = () => {
   if (!goodsInventoryAddForm.value.warehouse_id) {
-    store.dispatch('message/error', '请选择仓库!');
+    store.dispatch('message/error', t('change')+t('warechouse')+'!');
     return;
   }
   if (!goodsInventoryAddForm.value.inventory_type) {
-    store.dispatch('message/error', '请选择盘点类型!');
+    store.dispatch('message/error', t('change')+t('inventoryType')+'!');
     return;
   }
   scanDialogVisible.value = true;
@@ -478,22 +481,22 @@ const scanCode = () => {
 /* 获取审核人名称 */
 const getNotice = (value: string) => {
   const type = auditList.value.find((type: any) => type.id === value);
-  return type ? type.nickname : '未知类型';
+  return type ? type.nickname : t('unknown');
 };
 
 const getadminList = (value: string) => {
   const type = adminList.value.find((type: any) => type.id === value);
-  return type ? type.nickname : '未知类型';
+  return type ? type.nickname : t('unknown');
 };
 
 const getRoleSplit = (value: string) => {
   const type = typeList.value.find((type: any) => type.value === value);
-  return type ? type.label : '未知类型';
+  return type ? type.label : t('unknown');
 };
 
 const getWarehouse = (value: string) => {
   const type = warehouseList.value.find((type: any) => type.id === value);
-  return type ? type.name : '未知类型';
+  return type ? type.name : t('unknown');
 };
 
 const printIng = () => {
@@ -537,13 +540,13 @@ const handlePassGoodsInventory = () => {
 
 const handleRejectGoodsInventory = () => {
   if (!goodsInventoryAddForm.value.reject_reason) {
-    store.dispatch('message/error', '请填写驳回原因!');
+    ElMessage.error(t('reject_reason'));
     return;
   }
-  ElMessageBox.confirm('确定拒绝吗?', '提示', { type: 'warning' })
+  ElMessageBox.confirm(t('confirm_rejec'), t('prompt'), { type: 'warning' })
     .then(() => {
       API_GoodsInventory.auditGoodsInventory(id.value, { status: 'REJECT', reject_reason: goodsInventoryAddForm.value.reject_reason }).then(() => {
-        store.dispatch('message/success', '已拒绝!');
+        ElMessage.success(t('rejected'));
         const { callback } = store.state.route.params;
         if (typeof callback === 'function') callback();
         store.dispatch('delCurrentViews', {
@@ -596,12 +599,12 @@ const submitGoodsInventoryAddForm = () => {
       }));
       if (id.value) {
         API_GoodsInventory.editgoodsInventoryAdd(id.value, params).then(() => {
-          ElMessage.success('修改成功!');
+          ElMessage.success(t('edit_success')+'!');
           router.push({ name: 'goodsInventory' });
         });
       } else {
         API_GoodsInventory.addgoodsInventoryAdd(params).then(() => {
-          ElMessage.success('添加成功!');
+          ElMessage.success(t('add_success')+'!');
           router.push({ name: 'goodsInventory' });
         });
       }
@@ -611,7 +614,7 @@ const submitGoodsInventoryAddForm = () => {
 
 const handleSelectWarehouseEntryBatch = async () => {
   if (!goodsInventoryAddForm.value.warehouse_id) {
-    store.dispatch('message/error', '请先选择仓库!');
+    ElMessage.error(t('change')+t('warechouse')+'!');
     return;
   }
   API_GoodsExchange.getGoodsInfo(params, goodsInventoryAddForm.value.warehouse_id, 'le').then((res) => {

+ 54 - 51
src/views/stock/goodsInventoryLossAdd.vue

@@ -1,8 +1,8 @@
 <template>
   <div class="bg-in-stock">
     <el-form ref="goodsInventoryAddFormRef" :model="goodsInventoryAddForm" :rules="goodsInventoryAddFormRule" label-width="120px" inline class="change-form">
-      <h3 style="width: 100%">库存报损</h3>
-      <el-form-item label="报损时间" prop="report_time" class="change-form-item">
+      <h3 style="width: 100%">{{$t('goodsInventoryLoss')}}</h3>
+      <el-form-item :label="$t('loss_time')" prop="report_time" class="change-form-item">
         <span v-if="type == 'view'|| type == 'examine'">{{ goodsInventoryAddForm.report_time }}</span>
         <el-date-picker
           v-else
@@ -10,11 +10,11 @@
           value-format="YYYY-MM-DD HH:mm:ss"
           type="datetime"
           :disabled="type === 'view' || type === 'examine' || type === 'edit'"
-          placeholder="选择日期时间"
+          :placeholder="$t('change')+$t('date')"
         >
         </el-date-picker>
       </el-form-item>
-      <el-form-item label="仓库" prop="warehouse_id" class="change-form-item">
+      <el-form-item :label="$t('warechouse')" prop="warehouse_id" class="change-form-item">
         <span v-if="type == 'view'|| type === 'examine'">{{ getWarehouse(goodsInventoryAddForm.warehouse_id) }}</span>
         <el-select
           v-else
@@ -25,13 +25,13 @@
           <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
         </el-select>
       </el-form-item>
-      <el-form-item label="报损类型" prop="damage_type_value" class="change-form-item">
+      <el-form-item :label="$t('loss_type')" prop="damage_type_value" class="change-form-item">
         <span v-if="type == 'view'|| type === 'examine'">{{ getRoleSplit(goodsInventoryAddForm.damage_type_value) }}</span>
         <el-select v-else v-model="goodsInventoryAddForm.damage_type_value" :disabled="type === 'view' || type === 'audit' || type === 'examine'">
           <el-option v-for="item in roleSplit" :key="item.label" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
-      <el-form-item label="制单人" prop="creator_id" class="change-form-item">
+      <el-form-item :label="$t('creator')" prop="creator_id" class="change-form-item">
         <span v-if="type == 'view'|| type === 'examine'">{{ getadminList(goodsInventoryAddForm.creator_id) }}</span>
         <el-select
           v-else
@@ -42,16 +42,16 @@
           <el-option v-for="item in adminList" :key="item.id" :label="item.nickname" :value="item.id" />
         </el-select>
       </el-form-item>
-      <el-form-item label="是否通知审核人:" prop="has_notice" class="change-form-item">
+      <el-form-item :label="$t('notifiedre')+':'" prop="has_notice" class="change-form-item">
         <el-switch v-model="goodsInventoryAddForm.has_notice" :disabled="type === 'view'||type === 'examine'" inline-prompt :active-text="true" :inactive-text="false" /> </el-form-item
       ><!-- v-if="goodsInventoryAddForm.has_notice" -->
-      <el-form-item label="审核人:" prop="notice_user_id" class="change-form-item" v-if="goodsInventoryAddForm.has_notice">
+      <el-form-item :label="$t('reviewer')+':'" prop="notice_user_id" class="change-form-item" v-if="goodsInventoryAddForm.has_notice">
         <span v-if="id && type !== 'examine'||type == 'view'">{{ getNotice(goodsInventoryAddForm.notice_user_id) }}</span>
         <el-select v-else v-model="goodsInventoryAddForm.notice_user_id" :disabled="type === 'view' || type === 'audit' || type === 'examine'">
           <el-option v-for="item in auditList" :key="item.id" :label="item.nickname" :value="item.id" />
         </el-select>
       </el-form-item>
-      <el-form-item label="报损说明" prop="report_desc" class="change-form-item" style="width: 61%">
+      <el-form-item :label="$t('loss_desc')" prop="report_desc" class="change-form-item" style="width: 61%">
         <span v-if="type == 'view'|| type === 'examine'">{{ goodsInventoryAddForm.report_desc }}</span>
         <el-input
           v-else
@@ -60,15 +60,15 @@
           type="textarea"
           :disabled="type === 'view' || type === 'audit' || type === 'examine'"
           :autosize="{ minRows: 3, maxRows: 4 }"
-          placeholder="请输入报损说明"
+          :placeholder="$t('place')+$t('loss_desc')"
         ></el-input>
       </el-form-item>
       <div class="mx">
-        <h3>报损商品明细</h3>
+        <h3>{{$t('goods_inventory')}}</h3>
         <el-button v-if="type !== 'examine' && type !== 'audit' && type !== 'view'" class="button" size="mini" type="primary" @click="scanCode"
           >录入SKU</el-button
         >
-        <el-button v-if="type !== 'view' && type !== 'examine'" class="button" size="mini" type="primary" @click="handleSelectWarehouseEntryBatch">选择</el-button>
+        <el-button v-if="type !== 'view' && type !== 'examine'" class="button" size="mini" type="primary" @click="handleSelectWarehouseEntryBatch">{{$t('select')}}</el-button>
       </div>
       <div style="width: 100%; display: block">
         <el-form-item style="width: 100%">
@@ -85,7 +85,7 @@
                 <span v-else>{{ scope.row.goods_vo.sn }}</span>
               </template>
             </el-table-column> -->
-            <el-table-column label="商品名称">
+            <el-table-column :label="$t('goods_name')">
               <template #default="scope">
                 <span v-if="id">{{ scope.row.product_vo.name }}</span>
                 <span v-else>{{ scope.row.product_vo.name }}</span>
@@ -106,18 +106,18 @@
               </template>
             </el-table-column> 
             <el-table-column prop="product_vo.spec_name" label="规格型号"> </el-table-column>-->
-            <el-table-column label="单位">
+            <el-table-column :label="$t('goods_unit')">
               <template #default="scope">
                 <span v-if="!id"> {{ scope.row.product_vo.unit }}</span>
                 <span v-else> {{ scope.row.product_vo.unit }}</span>
               </template>
             </el-table-column>
-            <el-table-column label="库存数量">
+            <el-table-column :label="$t('stock')">
               <template #default="scope">
                 {{ scope.row.usable_stock }}
               </template>
             </el-table-column>
-            <el-table-column label="报损数量">
+            <el-table-column :label="$t('loss_num')">
               <template #default="scope">
                 <span v-if="type == 'edit'">{{ scope.row.num }}</span>
                 <el-input
@@ -130,9 +130,9 @@
                 ></el-input>
               </template>
             </el-table-column>
-            <el-table-column label="操作" v-if="type !== 'view' && type !== 'audit' && type !== 'examine'">
+            <el-table-column :label="$t('operate')" v-if="type !== 'view' && type !== 'audit' && type !== 'examine'">
               <template #default="scope">
-                <el-button size="mini" type="danger" @click="goodsInventoryAddForm.product_list.splice(scope.$index, 1)">删除</el-button>
+                <el-button size="mini" type="danger" @click="goodsInventoryAddForm.product_list.splice(scope.$index, 1)">{{$t('delete')}}</el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -140,11 +140,11 @@
       </div>
     </el-form>
     <div class="footer">
-      <el-button v-if="type !== 'examine' && type !== 'audit' && type !== 'view'" type="primary" @click="submitGoodsInventoryAddForm">保存 </el-button>
-      <el-button v-if="type === 'edit'||type === 'examine'" type="primary" @click="submitcont">审核 </el-button>
-      <el-button v-if="type === 'edit'||type === 'examine'" type="primary" @click="submitreject">驳回 </el-button>
+      <el-button v-if="type !== 'examine' && type !== 'audit' && type !== 'view'" type="primary" @click="submitGoodsInventoryAddForm">{{$t('save')}} </el-button>
+      <el-button v-if="type === 'edit'||type === 'examine'" type="primary" @click="submitcont">{{$t('review')}} </el-button>
+      <el-button v-if="type === 'edit'||type === 'examine'" type="primary" @click="submitreject">{{$t('down')}} </el-button>
       <!-- <el-button @click="printIng" v-if="type == 'view'">打印</el-button> -->
-      <el-button @click="$router.back()">返回 </el-button>
+      <el-button @click="$router.back()">{{ $t('return') }}</el-button>
     </div>
     <el-dialog title="扫码录入" v-model="scanDialogVisible" width="30%" :close-on-click-modal="false">
       <el-form ref="scanGoodsForm" :model="scanGoodsForm" inline label-width="60px">
@@ -164,33 +164,33 @@
       <!--  <span slot="footer" class="dialog-footer">
         </span> -->
     </el-dialog>
-    <el-dialog title="提示" v-model="dialogVisible" width="30%">
+    <el-dialog :title="$t('prompt')" v-model="dialogVisible" width="30%">
       <el-form ref="goodsInventoryAddForm" :model="goodsInventoryAddForm" label-width="120px" inline style="width: 900px">
-        <el-form-item label="驳回原因" prop="reject_reason">
+        <el-form-item :label="$t('reject')" prop="reject_reason">
           <el-input v-model="goodsInventoryAddForm.reject_reason" type="textarea" :minlength="0" :maxlength="100"></el-input>
         </el-form-item>
       </el-form>
       <template #footer>
-        <el-button @click="dialogVisible = false">取 消</el-button>
-        <el-button type="primary" @click="handleRejectGoodsInventoryLoss()">确 定</el-button>
+        <el-button @click="dialogVisible = false">{{$t('cancel')}}</el-button>
+        <el-button type="primary" @click="handleRejectGoodsInventoryLoss()">{{$t('submit')}}</el-button>
       </template>
     </el-dialog>
-    <el-dialog title="报损商品" v-model="goodsVisible" width="1000px" @close="closeGoosData">
+    <el-dialog :title="$t('loss_goods')" v-model="goodsVisible" width="1000px" @close="closeGoosData">
       <div style="display: flex; align-items: center; justify-content: flex-end; padding: 10px 0">
-        <span>搜索商品:</span><el-input v-model="params.keyWord" style="width: 200px; margin-right: 5px"></el-input>
-        <el-button @click="searchGoodEvent"> 搜索 </el-button>
+        <span>{{$t('search')+$t('goods_info')}}:</span><el-input v-model="params.keyWord" style="width: 200px; margin-right: 5px"></el-input>
+        <el-button @click="searchGoodEvent"> {{$t('search')}} </el-button>
       </div>
       <el-table :data="goodsData.records" border style="width: 100%" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" />
-        <el-table-column prop="product_vo.name" label="商品名称"></el-table-column>
+        <el-table-column prop="product_vo.name" :label="$t('goods_name')"></el-table-column>
         <el-table-column prop="product_vo.sku" label="sku"> </el-table-column>
-        <el-table-column prop="" label="品牌">
+        <el-table-column prop="" :label="$t('brand')">
           <template #default="scope">
             {{ scope.row.product_vo.brand }}
           </template>
         </el-table-column>
-        <el-table-column prop="product_vo.weight" label="重量"> </el-table-column>
-        <el-table-column prop="product_vo.unit" label="单位"> </el-table-column>
+        <el-table-column prop="product_vo.weight" :label="$t('weight')"> </el-table-column>
+        <el-table-column prop="product_vo.unit" :label="$t('goods_unit')"> </el-table-column>
       </el-table>
       <el-pagination
         @size-change="goodsPageSizeChange"
@@ -203,8 +203,8 @@
       >
       </el-pagination>
       <template #footer>
-        <el-button @click="closeGoosData">取 消</el-button>
-        <el-button type="primary" @click="submitGoosData()">确 定</el-button>
+        <el-button @click="closeGoosData">{{$t('cancel')}}</el-button>
+        <el-button type="primary" @click="submitGoosData()">{{$t('submit')}}</el-button>
       </template>
     </el-dialog>
   </div>
@@ -222,6 +222,9 @@ import * as API_Setting from '@/api/setting';
 import * as API_BasicSetting from '@/api/basicSetting';
 import * as API_Auth from '@/api/auth';
 /*   import { Foundation, RegExp } from '~/ui-utils'; */
+import { useI18n } from 'vue-i18n';
+
+const { t } = useI18n();
 
 const store = useStore();
 const route = useRoute();
@@ -241,10 +244,10 @@ const goodsInventoryAddForm = ref<any>({
   has_notice: false,
 });
 const goodsInventoryAddFormRule = ref({
-  warehouse_id: { required: true, message: '请选择报仓库', trigger: 'change' },
-  damage_type_value: { required: true, message: '请选择报损类型', trigger: 'change' },
-  dept_id: { required: true, message: '请选择所属部门', trigger: 'change' },
-  creator_id: { required: true, message: '请选择制单人', trigger: 'change' },
+  warehouse_id: { required: true, message: t('change')+t('warechouse'), trigger: 'change' },
+  damage_type_value: { required: true, message: t('change')+t('loss_type'), trigger: 'change' },
+  /* dept_id: { required: true, message: '请选择所属部门', trigger: 'change' }, */
+  creator_id: { required: true, message: t('change')+t('creator'), trigger: 'change' },
 });
 const warehouseProduct = ref(null);
 const scanDialogVisible = ref(false);
@@ -264,7 +267,7 @@ const GET_AuditList = () => {
 /* 获取审核人名称 */
 const getNotice = (value: string) => {
   const type = auditList.value.find((type: any) => type.id === value);
-  return type ? type.nickname : '未知类型';
+  return type ? type.nickname : t('unknown');
 };
 /* 报损商品信息 操作部分 */
 const goodsVisible = ref(false);
@@ -302,7 +305,7 @@ const submitGoosData = () => {
     });
     goodsVisible.value = false;
   } else {
-    ElMessage.error('请选择商品信息');
+    ElMessage.error(t('change')+t('goods_info')+'!');
   }
 };
 /* 盘点商品分页 */
@@ -318,17 +321,17 @@ const goodsPageCurrentChange = (page) => {
 
 const getadminList = (value: string) => {
   const type = adminList.value.find((type) => type.id === value);
-  return type ? type.nickname : '未知类型';
+  return type ? type.nickname : t('unknown');
 };
 
 const getRoleSplit = (value: string) => {
   const type = roleSplit.value.find((type) => type.value === value);
-  return type ? type.label : '未知类型';
+  return type ? type.label : t('unknown');
 };
 
 const getWarehouse = (value: string) => {
   const type = warehouseList.value.find((type) => type.id === value);
-  return type ? type.name : '未知类型';
+  return type ? type.name : t('unknown');
 };
 
 const cleanGoodsList = () => {
@@ -421,7 +424,7 @@ const submitGoodsInventoryAddForm = () => {
       });
       if (id.value) {
         API_GoodsInventoryLoss.editgoodsInventoryLossAdd(id.value, params).then(() => {
-          ElMessage.success('修改成功!');
+          ElMessage.success(t('edit_success')+'!');
           /* const { callback } = route.params;
             if (typeof callback === 'function') callback();
             store.dispatch('delCurrentViews', {
@@ -432,7 +435,7 @@ const submitGoodsInventoryAddForm = () => {
         });
       } else {
         API_GoodsInventoryLoss.addgoodsInventoryLossAdd(params).then(() => {
-          ElMessage.success('添加成功!');
+          ElMessage.success(t('add_success')+'!');
           /* const { callback } = route.params;
             if (typeof callback === 'function') callback();
             store.dispatch('delCurrentViews', {
@@ -471,7 +474,7 @@ const submitcont = () => {
         return query;
       });
       API_GoodsInventoryLoss.submit(id.value, params).then(() => {
-        ElMessage.success('审核成功!');
+        ElMessage.success(t('audit_success')+'!');
         /*  const { callback } = route.params;
           if (typeof callback === 'function') callback();
           store.dispatch('delCurrentViews', {
@@ -510,7 +513,7 @@ const submitreject = () => {
         return query;
       });
       API_GoodsInventoryLoss.submit(id.value, params).then(() => {
-        ElMessage.success('驳回成功!');
+        ElMessage.success(t('down_success')+'!');
         const { callback } = route.params;
         /* if (typeof callback === 'function') callback();
         store.dispatch('delCurrentViews', {
@@ -541,10 +544,10 @@ const handlePassGoodsInventoryLoss = () => {
 };
 
 const handleRejectGoodsInventoryLoss = () => {
-  ElMessageBox.confirm('确定拒绝吗?', '提示', { type: 'warning' })
+  ElMessageBox.confirm(t('confirm_rejec')+'?', t('prompt'), { type: 'warning' })
     .then(() => {
       API_GoodsInventoryLoss.auditGoodsInventoryLoss(id.value, { status: 'REJECT', reject_reason: goodsInventoryAddForm.value.reject_reason }).then(() => {
-        ElMessage.success('已拒绝!');
+        ElMessage.success(t('rejected')+'!');
         /* const { callback } = route.params;
       if (typeof callback === 'function') callback();
       store.dispatch('delCurrentViews', {
@@ -559,7 +562,7 @@ const handleRejectGoodsInventoryLoss = () => {
 
 const handleSelectWarehouseEntryBatch = async () => {
   if (!goodsInventoryAddForm.value.warehouse_id) {
-    ElMessage.error('请先选择仓库!');
+    ElMessage.error(t('change')+t('warechouse')+'!');
     return;
   }
   API_GoodsExchange.getGoodsInfo(params, goodsInventoryAddForm.value.warehouse_id, 'gt').then((res) => {

+ 17 - 17
src/views/stock/goodsUnderstock.vue

@@ -4,28 +4,28 @@
       <el-form :model="advancedForm" label-width="160px">
         <el-row>
           <el-col :span="8">
-            <el-form-item label="调出仓库">
+            <el-form-item :label="$t('out_warehouse')">
               <el-select v-model="advancedForm.out_warehouse_id">
                 <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="调入仓库">
+            <el-form-item :label="$t('to_warehouse')">
               <el-select v-model="advancedForm.in_warehouse_id">
                 <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="状态">
+            <el-form-item :label="$t('warehousing_state')">
               <el-select v-model="advancedForm.status">
                 <el-option v-for="item in statusList" :key="item.id" :label="item.label" :value="item.value" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="时间">
+            <el-form-item :label="$t('transfer_time')">
               <el-date-picker
                 v-model="advancedForm.purchasePlan_time_range"
                 type="daterange"
@@ -35,8 +35,8 @@
                 :clearable="true"
                 :default-time="['00:00:00', '23:59:59']"
                 range-separator="-"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
+                :start-placeholder="$t('start_time')"
+                :end-placeholder="$t('end_time')"
                 value-format="timestamp"
                 :picker-options="{
                   disabledDate(time) {
@@ -49,14 +49,14 @@
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="调拨单号">
+            <el-form-item :label="$t('transfer_sn')">
               <el-input v-model="advancedForm.sn" placeholder="请输入调拨单号"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
       </el-form>
       <div class="flex justify-end">
-        <el-button @click="advancedSearchEvent"> 搜索 </el-button>
+        <el-button @click="advancedSearchEvent"> {{$t('search')}} </el-button>
       </div>
     </div>
     <en-table-layout :tableData="tableData.data" :loading="loading" @selection-change="handleSelectionChange">
@@ -64,42 +64,42 @@
         <div class="inner-toolbar">
           <div class="toolbar-btns">
            <!--  v-if="checkPermission(['goodsUnderstock:add'])" -->
-            <el-button size="mini"  type="primary" v-if="store.state.user.user.founder!==1" @click="handleAddGoodsUnderstock">新增</el-button>
+            <el-button size="mini"  type="primary" v-if="store.state.user.user.founder!==1" @click="handleAddGoodsUnderstock">{{$t('add')}}</el-button>
           </div>
         </div>
       </template>
 
       <template #table-columns>
         <el-table-column type="selection" width="55" />
-        <el-table-column prop="sn" label="调拨单编号">
+        <el-table-column prop="sn" :label="$t('transfer_sn')">
           <template #default="scope">
             <span>{{ scope.row.sn }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="调拨时间">
+        <el-table-column :label="$t('transfer_time')">
           <template #default="scope">{{ scope.row.transfer_time }}</template>
         </el-table-column>
-        <el-table-column prop="out_warehouse_name" label="调出仓库">
+        <el-table-column prop="out_warehouse_name" :label="$t('out_warehouse')">
           <template #default="scope">
             {{ warehouseName(scope.row.out_warehouse_id) }}
           </template>
         </el-table-column>
-        <el-table-column prop="in_warehouse_name" label="调入仓库">
+        <el-table-column prop="in_warehouse_name" :label="$t('to_warehouse')">
           <template #default="scope">
             {{ warehouseName(scope.row.in_warehouse_id) }}
           </template>
         </el-table-column>
-        <el-table-column prop="" label="配送方式">
+        <el-table-column prop="" :label="$t('delivery_method')">
           <template #default="scope">
             {{ getTypename(scope.row.send_type) }}
           </template>
         </el-table-column>
-        <el-table-column prop="status" label="状态">
+        <el-table-column prop="status" :label="$t('warehousing_state')">
           <template #default="scope">{{ get_typeName(scope.row.status) }}</template>
         </el-table-column>
-        <el-table-column label="操作" width="250">
+        <el-table-column :label="$t('operate')" width="250">
           <template #default="scope">
-            <el-button size="mini" @click="handleSubmitGoodsTransfer(scope.row)">查看</el-button
+            <el-button size="mini" @click="handleSubmitGoodsTransfer(scope.row)">{{$t('view')}}</el-button
             ><!-- v-if="checkPermission(['goodsUnderstockDetail'])" -->
           </template>
         </el-table-column>

+ 42 - 54
src/views/stock/goodsUnderstockAdd.vue

@@ -1,8 +1,8 @@
 <template>
   <div class="bg-in-stock">
     <el-form ref="GoodsTransferFormRef" :model="GoodsTransferForm" label-width="120px" :rules="GoodsTransferFormRule" inline>
-      <h3>调拨单</h3>
-      <el-form-item label="调拨时间" prop="transfer_time" class="change-form-item">
+      <h3>{{$t('transfer_order')}}</h3>
+      <el-form-item :label="$t('transfer_time')" prop="transfer_time" class="change-form-item">
         <span v-if="type === 'view'">{{ GoodsTransferForm.transfer_time }}</span>
         <el-date-picker
           v-else
@@ -10,34 +10,34 @@
           value-format="YYYY-MM-DD HH:mm:ss"
           type="datetime"
           :disabled="type === 'view' || type === 'audit' || type === 'check'"
-          placeholder="选择日期时间"
+          :placeholder="$t('change')+$t('date')"
         >
         </el-date-picker>
       </el-form-item>
-      <el-form-item prop="out_warehouse_id" label="调出仓库">
+      <el-form-item prop="out_warehouse_id" :label="$t('out_warehouse')">
         <span v-if="type === 'view'">{{ getWarehouse(GoodsTransferForm.out_warehouse_id) }}</span>
         <el-select v-else @change="cleanGoodsList" v-model="GoodsTransferForm.out_warehouse_id" :disabled="type === 'view'">
           <el-option v-for="item in WarehouseList" :key="item.id" :label="item.name" :value="item.id" />
         </el-select>
       </el-form-item>
-      <el-form-item prop="in_warehouse_id" label="调入仓库">
+      <el-form-item prop="in_warehouse_id" :label="$t('to_warehouse')">
         <span v-if="type === 'view'">{{ getWarehouse(GoodsTransferForm.in_warehouse_id) }}</span>
         <el-select v-else v-model="GoodsTransferForm.in_warehouse_id" :disabled="type === 'view'">
           <el-option v-for="item in WarehouseList" :key="item.id" :label="item.name" :value="item.id" />
         </el-select>
       </el-form-item>
-      <el-form-item label="配送方式" prop="send_type">
+      <el-form-item :label="$t('delivery_method')" prop="send_type">
         <span v-if="type === 'view'">{{ getdeliveryType(GoodsTransferForm.send_type) }}</span>
         <el-select v-else v-model="GoodsTransferForm.send_type" clearable :disabled="type === 'view'">
           <el-option v-for="item in deliveryTypeList" :key="item.id" :label="item.name" :value="item.id" />
         </el-select>
       </el-form-item>
-      <el-form-item label="备注" prop="remark">
+      <el-form-item :label="$t('notes')" prop="remark">
         <span v-if="type === 'view'">{{ GoodsTransferForm.remark }}</span>
-        <el-input v-else :disabled="type === 'view'" type="textarea" :rows="2" placeholder="请输入内容" v-model="GoodsTransferForm.remark"> </el-input>
+        <el-input v-else :disabled="type === 'view'" type="textarea" :rows="2" :placeholder="$t('place')" v-model="GoodsTransferForm.remark"> </el-input>
       </el-form-item>
       <div class="mx">
-        <h3>商品明细</h3>
+        <h3>{{$t('goods_inventory')}}</h3>
         <el-button class="button" size="mini" type="primary" v-if="type !== 'view'" @click="handleSelectWarehouseEntryBatch">选择</el-button>
       </div>
       <div style="display: block">
@@ -48,12 +48,7 @@
           :header-cell-style="{ textAlign: 'center' }"
           style="width: 100%; margin-top: 20px"
         >
-         <!--  <el-table-column label="商品编号">
-            <template #default="scope">
-              <span>{{ scope.row.goods_vo.sn }}</span>
-            </template>
-          </el-table-column> -->
-          <el-table-column label="商品名称">
+          <el-table-column :label="$t('goods_name')">
             <template #default="scope">
               <span>{{ scope.row.product_vo.name }}</span>
             </template>
@@ -63,23 +58,17 @@
               <span>{{ scope.row.product_vo.sku }}</span>
             </template>
           </el-table-column>
-       <!--    <el-table-column label="序列号">
-            <template #default="scope">
-              <span>{{ scope.row.product_vo.sn_code }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column prop="product_vo.spec_name" label="规格型号"></el-table-column> -->
-          <el-table-column label="单位">
+          <el-table-column :label="$t('goods_unit')">
             <template #default="scope">
               <span>{{ scope.row.product_vo.unit }}</span>
             </template>
           </el-table-column>
-          <el-table-column label="库存数量">
+          <el-table-column :label="$t('inventory_num')">
             <template #default="scope">
               <span>{{ scope.row.usable_stock }}</span>
             </template>
           </el-table-column>
-          <el-table-column label="调拨数量">
+          <el-table-column :label="$t('transfer_num')">
             <template #default="scope">
               <span v-if="type === 'view'">{{ scope.row.num }}</span>
               <el-input
@@ -92,35 +81,35 @@
               ></el-input>
             </template>
           </el-table-column>
-          <el-table-column label="操作" v-if="type !== 'view'">
+          <el-table-column :label="$t('operate')" v-if="type !== 'view'">
             <template #default="scope">
-              <el-button size="mini" type="danger" @click="GoodsTransferForm.product_list.splice(scope.$index, 1)">删除</el-button>
+              <el-button size="mini" type="danger" @click="GoodsTransferForm.product_list.splice(scope.$index, 1)">{{$t('delete')}}</el-button>
             </template>
           </el-table-column>
         </el-table>
       </div>
     </el-form>
     <div class="footer">
-      <el-button v-if="type !== 'view'" type="primary" @click="submitGoodsTransferForm">保存</el-button>
-      <el-button @click="printIng">打印</el-button>
-      <el-button @click="roBack">返回</el-button>
+      <el-button v-if="type !== 'view'" type="primary" @click="submitGoodsTransferForm">{{$t('save')}}</el-button>
+      <el-button @click="printIng">{{$t('print')}}</el-button>
+      <el-button @click="roBack">{{$t('return')}}</el-button>
     </div>
-    <el-dialog title="调拨商品" v-model="goodsVisible" width="1000px" @close="closeGoosData">
+    <el-dialog :title="$t('transfer_goods')" v-model="goodsVisible" width="1000px" @close="closeGoosData">
       <div style="display: flex; align-items: center; justify-content: flex-end; padding: 10px 0">
-        <span>搜索商品:</span><el-input v-model="params.keyWord" style="width: 200px; margin-right: 5px"></el-input>
-        <el-button @click="searchGoodEvent"> 搜索 </el-button>
+        <span>{{$t('search_goods')}}:</span><el-input v-model="params.keyWord" style="width: 200px; margin-right: 5px"></el-input>
+        <el-button @click="searchGoodEvent"> {{$t('search')}} </el-button>
       </div>
       <el-table :data="goodsData.records" border style="width: 100%" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" />
-        <el-table-column prop="product_vo.name" label="商品名称"></el-table-column>
+        <el-table-column prop="product_vo.name" :label="$t('goods_name')"></el-table-column>
         <el-table-column prop="product_vo.sku" label="sku"> </el-table-column>
-        <el-table-column prop="" label="品牌">
+        <el-table-column prop="" :label="$t('brand')">
           <template #default="scope">
             {{ scope.row.product_vo.brand }}
           </template>
         </el-table-column>
-        <el-table-column prop="product_vo.weight" label="重量"> </el-table-column>
-        <el-table-column prop="product_vo.unit" label="单位"> </el-table-column>
+        <el-table-column prop="product_vo.weight" :label="$t('weight')"> </el-table-column>
+        <el-table-column prop="product_vo.unit" :label="$t('goods_unit')"> </el-table-column>
       </el-table>
       <el-pagination
         @size-change="goodsPageSizeChange"
@@ -133,8 +122,8 @@
       >
       </el-pagination>
       <template #footer>
-        <el-button @click="closeGoosData">取 消</el-button>
-        <el-button type="primary" @click="submitGoosData()">确 定</el-button>
+        <el-button @click="closeGoosData">{{$t('cancel')}}</el-button>
+        <el-button type="primary" @click="submitGoosData()">{{$t('submit')}}</el-button>
       </template>
     </el-dialog>
   </div>
@@ -151,6 +140,9 @@ import * as API_Express from '@/api/express';
 import * as API_GoodsExchange from '@/api/goodsExchange';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import { useRouter, useRoute } from 'vue-router';
+import { useI18n } from 'vue-i18n';
+
+const { t } = useI18n();
 
 const router = useRouter();
 const route = useRoute();
@@ -176,34 +168,34 @@ const GoodsTransferForm = ref<any>({
 const GoodsTransferFormRule = ref({
   transfer_time: {
     required: true,
-    message: '请选择调整时间',
+    message: t('change')+t('transfer_time'),
     trigger: 'change',
   },
   out_warehouse_id: {
     required: true,
-    message: '请选择调出仓库',
+    message: t('change')+t('out_warehouse'),
     trigger: 'change',
   },
   in_warehouse_id: {
     required: true,
-    message: '请选择调入仓库',
+    message: t('change')+t('to_warehouse'),
     trigger: 'change',
   },
   send_type: {
     required: true,
-    message: '请选择配送方式',
+    message: t('change')+t('delivery_method'),
     trigger: 'change',
   },
 });
 
 const getdeliveryType = (value: string) => {
   const type = deliveryTypeList.value.find((type) => type.id === value);
-  return type ? type.name : '未知类型';
+  return type ? type.name : t('unknown');
 };
 
 const getWarehouse = (value: string) => {
   const type = WarehouseList.value.find((type) => type.id === value);
-  return type ? type.name : '未知类型';
+  return type ? type.name : t('unknown');
 };
 
 const printIng = () => {
@@ -231,21 +223,17 @@ const searchGoodEvent = () => {
 const goodsList = ref([]);
 const handleSelectionChange = (val) => {
   goodsList.value = val.map((el) => {
-    /* el.product_id = el.id;
-    el.goods_id = el.id;
-    el.sn_code_list = []; */
     return el;
   });
 };
 const submitGoosData = () => {
   if (goodsList.value.length >= 1) {
     GoodsTransferForm.value.product_list = goodsList.value.map((el) => {
-      /* el.sn_code_list = []; */
       return el;
     });
     goodsVisible.value = false;
   } else {
-    ElMessage.error('请选择商品信息');
+    ElMessage.error(t('change')+t('goods_info')+'!');
   }
 };
 /* 盘点商品分页 */
@@ -290,7 +278,7 @@ const roBack = () => {
 
 const handleSelectWarehouseEntryBatch = async () => {
   if (!GoodsTransferForm.value.out_warehouse_id) {
-    ElMessage.error('请先选择调出仓库!');
+    ElMessage.error(t('change')+t('out_warehouse')+'!');
     return;
   }
   API_GoodsExchange.getGoodsInfo(params, GoodsTransferForm.value.out_warehouse_id, 'gt').then((res) => {
@@ -319,11 +307,11 @@ const submitGoodsTransferForm = () => {
     if (valid) {
       const params = { ...GoodsTransferForm.value };
       if (params.product_list.length === 0) {
-        ElMessage.error('请选择商品!');
+        ElMessage.error(t('change')+t('goods_info')+'!');
         return;
       }
       if (params.in_warehouse_id === params.out_warehouse_id) {
-        ElMessage.error('调出和调入仓库不能一致!');
+        ElMessage.error(t('out_warehouse')+t('to_warehouse')+t('consistent')+'!');
         return;
       }
       params.product_list = params.product_list.map((item: any) => ({
@@ -335,7 +323,7 @@ const submitGoodsTransferForm = () => {
       }));
       if (id.value) {
         API_GoodsTransfer.editGoodsTransfer(id.value, params).then(() => {
-            ElMessage.success('修改成功!');
+            ElMessage.success(t('edit_success')+'!');
          /*  const { callback } = store.state.route.params;
           if (typeof callback === 'function') callback();
           store.dispatch('delCurrentViews', {
@@ -346,7 +334,7 @@ const submitGoodsTransferForm = () => {
         });
       } else {
         API_GoodsTransfer.addGoodsTransfer(params).then(() => {
-            ElMessage.success('添加成功!');
+            ElMessage.success(t('add_success')+'!');
           /* const { callback } = store.state.route.params;
           if (typeof callback === 'function') callback();
           store.dispatch('delCurrentViews', {

+ 1 - 1
src/views/stock/outbound.vue

@@ -64,7 +64,7 @@
             <!-- <el-button size="mini" v-if="checkPermission(['addInventory']) && activeName === 'second'" type="primary" @click="handleAddGoodsExchange"
                 >新增入库</el-buttonv-if="checkPermission(['goodsExchangeAdd'])"
               > -->
-            <el-button size="mini" type="primary" v-if="store.state.user.user.founder!==1" @click="handleShiftGoodsExchange">新增出库</el-button>
+            <el-button size="mini" type="primary" v-if="store.state.user.user.founder!==1" @click="handleShiftGoodsExchange">{{$t('addOut')}}</el-button>
           </div>
         </div>
       </template>

+ 27 - 13
src/views/stock/warehousing.vue

@@ -1,12 +1,13 @@
 <template>
   <div>
     <!-- flex items-center -->
-    <div class="search bg-white pt-2">
-      <el-form ref="advancedFormRef" :model="advancedForm" label-width="100px">
+    <div class="search bg-white pt-2 dark:!bg-[#060818]">
+      <el-form ref="advancedFormRef" :model="advancedForm" label-width="130px">
         <el-row>
           <el-col :span="activeName === 'first' ? 12 : 8">
             <el-form-item :label="$t('access_time')">
               <el-date-picker
+                class="dark:!bg-[#060818]"
                 v-model="advancedForm.goodsExchange_time_range"
                 type="daterange"
                 align="center"
@@ -29,32 +30,32 @@
           </el-col>
           <el-col :span="8">
             <el-form-item :label="$t('warechouse')">
-              <el-select v-model="advancedForm.warehouse_id" clearable>
+              <el-select v-model="advancedForm.warehouse_id" clearable class="dark:!bg-[#060818]">
                 <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="6">
             <el-form-item :label="$t('storage_type')">
-              <el-select v-model="advancedForm.type" clearable>
+              <el-select v-model="advancedForm.type" clearable class="dark:!bg-[#060818]">
                 <el-option v-for="item in entryList" :key="item.id" :label="item.label" :value="item.value" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item :label="$t('customer_name')">
-              <el-input v-model="advancedForm.customer_name" clearable :placeholder="$t('change')+$t('customer_name')"></el-input>
+              <el-input v-model="advancedForm.customer_name" class="dark:!bg-[#060818]" clearable :placeholder="$t('change') + $t('customer_name')"></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item :label="$t('phone')">
-              <el-input v-model="advancedForm.customer_phone" clearable :placeholder="$t('change')+$t('phone')"></el-input>
+              <el-input v-model="advancedForm.customer_phone" class="dark:!bg-[#060818]" clearable :placeholder="$t('change') + $t('phone')"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
       </el-form>
       <div class="flex justify-end">
-        <el-button class="mr-3" @click="advancedSearchEvent"> {{$t('search')}} </el-button>
+        <el-button class="mr-3 dark:!bg-[#060818]" @click="advancedSearchEvent"> {{ $t('search') }} </el-button>
       </div>
     </div>
 
@@ -62,13 +63,15 @@
       <template #toolbar>
         <div class="inner-toolbar">
           <div class="toolbar-btns">
-            <el-button size="mini" type="primary" v-if="store.state.user.user.founder!==1" @click="handleAddGoodsExchange">新增入库</el-button>
+            <el-button size="mini" type="primary" v-if="store.state.user.user.founder !== 1" @click="handleAddGoodsExchange">{{
+              $t('addInventory')
+            }}</el-button>
           </div>
         </div>
       </template>
 
       <template #table-columns>
-        <el-table-column type="selection" width="55" />
+        <el-table-column type="selection" width="55" class="dark:!bg-[#060818]"/>
         <el-table-column prop="sn" :label="$t('warehousing_sn')">
           <template #default="scope">
             {{ scope.row.sn }}
@@ -84,7 +87,7 @@
             <span>{{ entryName(scope.row.type) }}</span>
           </template>
         </el-table-column>
-        <el-table-column  :label="$t('warehousing_time')">
+        <el-table-column :label="$t('warehousing_time')">
           <template #default="scope">
             <span>{{ scope.row.create_time }}</span>
           </template>
@@ -102,9 +105,15 @@
         <el-table-column :label="$t('operate')">
           <template #default="scope">
             <!-- v-if="checkPermission(['checkInventory'])" -->
-            <el-button class="mr-1 mt-1" size="mini" @click="handleAuditGoodsExchange(scope.row)">{{$t('view')}}</el-button>
+            <el-button class="mr-1 mt-1" size="mini" @click="handleAuditGoodsExchange(scope.row)">{{ $t('view') }}</el-button>
             <!-- && checkPermission(['editInventory']) && checkPermission(['goodsExchangeEdit']) -->
-            <el-button size="mini" class="!ml-0 mt-1" v-if="scope.row.has_submit === 'N' && store.state.user.user.founder!==1" @click="handleEditGoodsExchange(scope.row)">{{$t('warehousing')}}</el-button>
+            <el-button
+              size="mini"
+              class="!ml-0 mt-1"
+              v-if="scope.row.has_submit === 'N' && store.state.user.user.founder !== 1"
+              @click="handleEditGoodsExchange(scope.row)"
+              >{{ $t('warehousing') }}</el-button
+            >
           </template>
         </el-table-column>
       </template>
@@ -301,4 +310,9 @@ watchEffect(() => {
   params.page_no = 1;
   GET_WarehouseEntry();
 });
-</script>
+</script>
+<!-- <style scoped>
+::v-deep .custom-select .el-input__inner {
+  background-color: #060818 !important;
+}
+</style> -->