Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
H
hh_ccs
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
贺阳
hh_ccs
Commits
e45e94d5
提交
e45e94d5
authored
4月 01, 2025
作者:
刘擎阳
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'feature/数据迁移' into develop
上级
81199473
01231d62
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
19 个修改的文件
包含
787 行增加
和
4 行删除
+787
-4
__manifest__.py
ccs_base/__manifest__.py
+6
-1
timer.xml
ccs_base/data/timer.xml
+17
-0
zh_CN.po
ccs_base/i18n/zh_CN.po
+0
-0
__init__.py
ccs_base/models/__init__.py
+5
-0
cc_bill_loading.py
ccs_base/models/cc_bill_loading.py
+15
-2
cc_history_big_package.py
ccs_base/models/cc_history_big_package.py
+102
-0
cc_history_package_good.py
ccs_base/models/cc_history_package_good.py
+99
-0
cc_history_package_sync_log.py
ccs_base/models/cc_history_package_sync_log.py
+31
-0
cc_history_ship_package.py
ccs_base/models/cc_history_ship_package.py
+179
-0
ir.model.access.csv
ccs_base/security/ir.model.access.csv
+6
-0
cc_bl_view.xml
ccs_base/views/cc_bl_view.xml
+7
-1
cc_history_big_package_view.xml
ccs_base/views/cc_history_big_package_view.xml
+0
-0
cc_history_package_good_view.xml
ccs_base/views/cc_history_package_good_view.xml
+190
-0
cc_history_package_sync_log_view.xml
ccs_base/views/cc_history_package_sync_log_view.xml
+95
-0
cc_history_ship_package_view.xml
ccs_base/views/cc_history_ship_package_view.xml
+0
-0
menu_view.xml
ccs_base/views/menu_view.xml
+11
-0
config.py
consumers/config.py
+8
-0
history_data.py
consumers/history_data.py
+0
-0
history_data.conf
consumers/supervisord_conf/conf.d/history_data.conf
+16
-0
没有找到文件。
ccs_base/__manifest__.py
浏览文件 @
e45e94d5
...
@@ -24,8 +24,8 @@
...
@@ -24,8 +24,8 @@
'wizard/add_exception_info_wizard_views.xml'
,
'wizard/add_exception_info_wizard_views.xml'
,
'wizard/email_template.xml'
,
'wizard/email_template.xml'
,
'data/data.xml'
,
'data/data.xml'
,
'data/timer.xml'
,
'data/sequence.xml'
,
'data/sequence.xml'
,
'views/menu_view.xml'
,
'views/cc_clearance_file_view.xml'
,
'views/cc_clearance_file_view.xml'
,
'views/cc_node_view.xml'
,
'views/cc_node_view.xml'
,
'views/cc_last_mile_provider_views.xml'
,
'views/cc_last_mile_provider_views.xml'
,
...
@@ -37,6 +37,11 @@
...
@@ -37,6 +37,11 @@
'views/cc_node_exception_reason_view.xml'
,
'views/cc_node_exception_reason_view.xml'
,
'views/cc_bl_view.xml'
,
'views/cc_bl_view.xml'
,
'views/res_config_setting.xml'
,
'views/res_config_setting.xml'
,
'views/cc_history_big_package_view.xml'
,
'views/cc_history_package_good_view.xml'
,
'views/cc_history_ship_package_view.xml'
,
'views/cc_history_package_sync_log_view.xml'
,
'views/menu_view.xml'
,
# 'views/cc_customers_declaration_order_view.xml',
# 'views/cc_customers_declaration_order_view.xml',
'templates/login.xml'
,
'templates/login.xml'
,
],
],
...
...
ccs_base/data/timer.xml
0 → 100644
浏览文件 @
e45e94d5
<odoo>
<data>
<record
id=
"cron_update_history_data"
model=
"ir.cron"
>
<field
name=
"name"
>
同步历史数据
</field>
<field
name=
"model_id"
ref=
"ccs_base.model_cc_bl"
/>
<field
name=
"state"
>
code
</field>
<field
name=
"code"
>
model.cron_update_history_data()
</field>
<field
name=
'interval_number'
>
1
</field>
<field
name=
'interval_type'
>
days
</field>
<field
name=
"numbercall"
>
-1
</field>
<field
name=
"active"
eval=
"False"
/>
</record>
</data>
</odoo>
\ No newline at end of file
ccs_base/i18n/zh_CN.po
浏览文件 @
e45e94d5
差异被折叠。
点击展开。
ccs_base/models/__init__.py
浏览文件 @
e45e94d5
...
@@ -11,3 +11,7 @@ from . import mail_thread
...
@@ -11,3 +11,7 @@ from . import mail_thread
from
.
import
order_state_change_rule
from
.
import
order_state_change_rule
from
.
import
res_config_setting
from
.
import
res_config_setting
from
.
import
cc_history_big_package
from
.
import
cc_history_package_good
from
.
import
cc_history_ship_package
from
.
import
cc_history_package_sync_log
\ No newline at end of file
ccs_base/models/cc_bill_loading.py
浏览文件 @
e45e94d5
# 导入odoo
# 导入odoo
# 导入日志
# 导入日志
import
logging
import
logging
from
datetime
import
timedelta
from
datetime
import
timedelta
,
datetime
import
json
import
pytz
import
pytz
from
odoo
import
models
,
fields
,
api
,
_
from
odoo
import
models
,
fields
,
api
,
_
from
odoo.exceptions
import
UserError
,
ValidationError
from
odoo.exceptions
import
UserError
,
ValidationError
...
@@ -634,6 +634,19 @@ class CcBL(models.Model):
...
@@ -634,6 +634,19 @@ class CcBL(models.Model):
item
.
big_package_ids
.
filtered
(
item
.
big_package_ids
.
filtered
(
lambda
package
:
package
.
tally_state
==
'handover_completed'
and
not
package
.
is_cancel
))
lambda
package
:
package
.
tally_state
==
'handover_completed'
and
not
package
.
is_cancel
))
def
cron_update_history_data
(
self
):
history_days
=
self
.
env
[
'ir.config_parameter'
]
.
sudo
()
.
get_param
(
'history_days'
)
or
180
history_limit
=
self
.
env
[
'ir.config_parameter'
]
.
sudo
()
.
get_param
(
'history_limit'
)
or
50
origin_delete
=
self
.
env
[
'ir.config_parameter'
]
.
sudo
()
.
get_param
(
'origin_delete'
)
or
1
redis_conn
=
self
.
env
[
'common.common'
]
.
sudo
()
.
get_redis
()
vals
=
{
'history_days'
:
history_days
,
'history_limit'
:
history_limit
,
'origin_delete'
:
origin_delete
}
redis_conn
.
lpush
(
'history_data_list'
,
json
.
dumps
(
vals
))
is_history
=
fields
.
Boolean
(
'历史单据'
,
default
=
False
)
# 提单号
# 提单号
bl_no
=
fields
.
Char
(
string
=
'B/L No'
,
index
=
True
)
bl_no
=
fields
.
Char
(
string
=
'B/L No'
,
index
=
True
)
# 关务提单号
# 关务提单号
...
...
ccs_base/models/cc_history_big_package.py
0 → 100644
浏览文件 @
e45e94d5
# 导入odoo
# 导入日志
import
logging
from
datetime
import
timedelta
import
pytz
from
odoo
import
models
,
fields
,
api
,
_
from
odoo.exceptions
import
UserError
# 获取日志
_logger
=
logging
.
getLogger
(
__name__
)
# 创建一个大包业务对象,用来管理包裹的信息.包裹信息包括所属提单、大包号、下一阶段服务商名称、包裹明细
class
CcHistoryBigPackage
(
models
.
Model
):
# 模型名称
_name
=
'cc.history.big.package'
# 历史大包
_inherit
=
[
'mail.thread'
,
'mail.activity.mixin'
]
# 模型描述
_description
=
'Big Package'
_rec_name
=
'big_package_no'
# 定义模型字段
origin_id
=
fields
.
Integer
(
string
=
'原大包id'
)
# 所属提单
bl_id
=
fields
.
Many2one
(
'cc.bl'
,
string
=
'Bill of Loading'
,
index
=
True
)
# 大包号
big_package_no
=
fields
.
Char
(
string
=
'Big Package No.'
,
index
=
True
)
# 下一阶段服务商名称
next_provider_name
=
fields
.
Char
(
string
=
'Next Provider Name'
)
# 小包 包裹明细
ship_package_ids
=
fields
.
One2many
(
'cc.history.ship.package'
,
'big_package_id'
,
string
=
'Ship Packages'
)
# 商品明细
goods_ids
=
fields
.
One2many
(
'cc.history.package.good'
,
'big_package_id'
,
string
=
'Goods'
)
# 增加包裹数量字段, 用于显示包裹数量, 根据big_package_line_ids计算
# ship_package_qty = fields.Integer(string='Package Qty', compute='_compute_big_package_qty', store=True)
ship_package_qty
=
fields
.
Integer
(
string
=
'Package Qty'
)
# 商品纪录数
# goods_qty = fields.Integer(string='Package Qty', compute='_compute_big_package_qty', store=True)
goods_qty
=
fields
.
Integer
(
string
=
'Package Qty'
)
# New fields: pallet_number (char type), pallet_usage_date
# 托盘号(char型),托盘使用日期
pallet_number
=
fields
.
Char
(
string
=
'Pallet Number'
)
pallet_usage_date
=
fields
.
Date
(
string
=
'Pallet Usage Date'
)
# 增加is_cancel字段, 用于标识大包是否取消, 来自提单的is_cancel字段
# is_cancel = fields.Boolean(string='Is Cancel', related='bl_id.is_cancel', store=True)
is_cancel
=
fields
.
Boolean
(
string
=
'Is Cancel'
)
tally_state
=
fields
.
Selection
([
(
'unprocessed_goods'
,
'Unprocessed goods'
),
(
'checked_goods'
,
'Checked goods'
),
(
'handover_completed'
,
'Handover Completed'
)
],
default
=
'unprocessed_goods'
,
string
=
'Tally Status'
,
index
=
True
)
# 理货状态 未理货/已理货/尾程交接
tally_user_id
=
fields
.
Many2one
(
'res.users'
,
'Tally User'
,
index
=
True
)
# 理货人
tally_time
=
fields
.
Datetime
(
'Tally Time'
)
# 理货时间
delivery_user_id
=
fields
.
Many2one
(
'res.users'
,
string
=
'Delivery User'
,
index
=
True
)
# 尾程交货人
delivery_time
=
fields
.
Datetime
(
string
=
'Delivery Time'
)
# 尾程交货时间
exception_info_ids
=
fields
.
Many2many
(
'cc.exception.info'
,
'history_bigpackage_exception_info_rel'
,
string
=
'Exception Information'
)
def
action_show_ship_package
(
self
):
# 返回一个action,显示包裹
return
{
'name'
:
_
(
'Ship Package'
),
'type'
:
'ir.actions.act_window'
,
'res_model'
:
'cc.history.ship.package'
,
'view_mode'
:
'tree,form'
,
'domain'
:
[(
'big_package_id'
,
'='
,
self
.
id
),
(
'is_cancel'
,
'='
,
False
)],
}
# 创建显示商品的action
def
action_show_package_good
(
self
):
# 返回一个action,显示商品
return
{
'name'
:
_
(
'Goods'
),
'type'
:
'ir.actions.act_window'
,
'res_model'
:
'cc.history.package.good'
,
'view_mode'
:
'tree,form'
,
'domain'
:
[(
'big_package_id'
,
'='
,
self
.
id
),
(
'is_cancel'
,
'='
,
False
)],
}
ccs_base/models/cc_history_package_good.py
0 → 100644
浏览文件 @
e45e94d5
# 导入odoo
# 导入日志
import
logging
from
datetime
import
timedelta
import
pytz
from
odoo
import
models
,
fields
,
api
,
_
from
odoo.exceptions
import
UserError
# 获取日志
_logger
=
logging
.
getLogger
(
__name__
)
class
CcPackageGood
(
models
.
Model
):
# 模型名称
_name
=
'cc.history.package.good'
# 历史小包商品
# 模型描述
_description
=
'Package Good'
_rec_name
=
'item_id'
# 定义模型字段
origin_id
=
fields
.
Integer
(
string
=
'原小包商品id'
)
# 所属小包裹
bl_line_id
=
fields
.
Many2one
(
'cc.history.ship.package'
,
string
=
'Ship Package'
,
index
=
True
)
# 所属大包
big_package_id
=
fields
.
Many2one
(
'cc.history.big.package'
)
# 增加一个提单对象的字段, 用于显示提单号,根据bl_line_id的bl_id字段
bl_id
=
fields
.
Many2one
(
'cc.bl'
)
# 按item_id,唯一
_sql_constraints
=
[
(
'item_id_uniq'
,
'unique(item_id)'
,
'The Item ID must be unique.'
)
]
item_id
=
fields
.
Char
(
string
=
'Item ID'
,
index
=
True
)
# SKU标识ID
sku_id
=
fields
.
Char
(
string
=
'SKU ID'
,
index
=
True
)
# 商品中文名称
item_name_cn
=
fields
.
Char
(
string
=
'Name CN'
,
index
=
True
)
# 商品英文名称
item_name_en
=
fields
.
Char
(
string
=
'Name EN'
,
index
=
True
)
# 出口HSCode
export_hs_code
=
fields
.
Char
(
string
=
'Export HSCode'
)
# 进口HSCode
import_hs_code
=
fields
.
Char
(
string
=
'Import HSCode'
)
# 重量
weight
=
fields
.
Float
(
string
=
'Weight'
)
# 数量
quantity
=
fields
.
Integer
(
string
=
'Quantity'
)
# 数量单位
quantity_unit
=
fields
.
Char
(
string
=
'Quantity Unit'
)
# 申报单价
declare_price
=
fields
.
Float
(
string
=
'Declare Price'
)
# 运费
freight
=
fields
.
Float
(
string
=
'Freight'
)
# COD金额
cod_amount
=
fields
.
Float
(
string
=
'COD Amount'
)
# VAT税率
vat_rate
=
fields
.
Float
(
string
=
'VAT Rate'
)
# 商品VAT
item_vat
=
fields
.
Float
(
string
=
'Good VAT'
)
# 原产国
origin_country
=
fields
.
Char
(
string
=
'Origin Country'
)
# 类型
item_type
=
fields
.
Selection
(
[(
'gift'
,
'Gift'
),
(
'normal'
,
'Normal'
),
(
'sample'
,
'Sample'
),
(
'return'
,
'Return'
)],
string
=
'Good Type'
)
# 商品总价
item_total_price
=
fields
.
Float
(
string
=
'Total Price'
)
# 商品链接
item_link
=
fields
.
Char
(
string
=
'Link'
)
# 商品交税情况
item_tax_status
=
fields
.
Selection
(
[(
'TTSTaxed'
,
'TTSTaxed'
),
(
'Sentinel'
,
'Sentinel'
),
(
'LSPTaxed'
,
'LSPTaxed'
),
(
'SellerObligation'
,
'SellerObligation'
)],
string
=
'Tax Status'
)
# 实缴代税总额
actual_tax
=
fields
.
Float
(
string
=
'Actual Tax'
)
# 实缴关税税率
actual_tax_rate
=
fields
.
Float
(
string
=
'Actual Tax Rate'
)
# 实缴关税币种
actual_tax_currency
=
fields
.
Char
(
string
=
'Actual Tax Currency'
)
# 实缴增值税
actual_vat
=
fields
.
Float
(
string
=
'Actual VAT'
)
# 实缴增值税税率
actual_vat_rate
=
fields
.
Float
(
string
=
'Actual VAT Rate'
)
# 实缴GST
actual_gst
=
fields
.
Float
(
string
=
'Actual GST'
)
# 实缴GST税率
actual_gst_rate
=
fields
.
Float
(
string
=
'Actual GST Rate'
)
# 币种
currency_id
=
fields
.
Many2one
(
'res.currency'
,
string
=
'Currency'
)
# 增加is_cancel字段, 用于标识是否取消, 来自小包的is_cancel字段
is_cancel
=
fields
.
Boolean
(
string
=
'Is Cancel'
)
ccs_base/models/cc_history_package_sync_log.py
0 → 100644
浏览文件 @
e45e94d5
# 导入odoo
# 导入日志
import
logging
from
datetime
import
timedelta
import
pytz
from
odoo
import
models
,
fields
,
api
,
_
from
odoo.exceptions
import
UserError
# 获取日志
_logger
=
logging
.
getLogger
(
__name__
)
class
CcHistoryPackageSyncLog
(
models
.
Model
):
_name
=
'cc.history.package.sync.log'
_description
=
'CC Ship Package Sync Log'
package_id
=
fields
.
Many2one
(
'cc.history.ship.package'
,
'Ship Package'
,
required
=
True
)
# 同步时间
sync_time
=
fields
.
Datetime
(
'Sync Time'
,
default
=
fields
.
Datetime
.
now
)
# 增加接口客户
api_customer
=
fields
.
Char
(
'Api Customer'
)
# 操作状态
process_code
=
fields
.
Char
(
'TK Process Code'
)
# 操作时间
operate_time
=
fields
.
Datetime
(
'Operate Time'
,
default
=
fields
.
Datetime
.
now
)
# 操作备注
operate_remark
=
fields
.
Text
(
'Operate Remark'
)
# 同步操作人
operate_user
=
fields
.
Many2one
(
'res.users'
,
'Operate User'
,
default
=
lambda
self
:
self
.
env
.
user
)
ccs_base/models/cc_history_ship_package.py
0 → 100644
浏览文件 @
e45e94d5
# 导入odoo
# 导入日志
import
logging
from
datetime
import
timedelta
import
pytz
from
odoo
import
models
,
fields
,
api
,
_
from
odoo.exceptions
import
UserError
# 获取日志
_logger
=
logging
.
getLogger
(
__name__
)
class
CcHistoryShipPackage
(
models
.
Model
):
# 模型名称
_name
=
'cc.history.ship.package'
# 历史小包
# 模型描述
_description
=
'Ship Package'
_rec_name
=
'tracking_no'
_inherit
=
[
'mail.thread'
,
'mail.activity.mixin'
]
_order
=
'bl_id, big_package_id,tracking_no'
customer_id
=
fields
.
Many2one
(
'res.partner'
,
string
=
'From Customer'
,
index
=
True
)
origin_id
=
fields
.
Integer
(
string
=
'原小包id'
)
# 定义模型字段
# 提单号
bl_id
=
fields
.
Many2one
(
'cc.bl'
,
string
=
'Bill of Loading'
,
index
=
True
)
# 大包号
big_package_id
=
fields
.
Many2one
(
'cc.history.big.package'
,
string
=
'Big Package'
,
index
=
True
)
# 物流订单号
logistic_order_no
=
fields
.
Char
(
string
=
'Logistic Order No'
,
index
=
True
)
# 按logistic_order_no,唯一
_sql_constraints
=
[
(
'logistic_order_no_uniq'
,
'unique(logistic_order_no)'
,
'The Logistic Order No must be unique.'
)
]
# 运单号(面单号)
tracking_no
=
fields
.
Char
(
string
=
'Tracking No'
,
index
=
True
)
# 对应面单号
# 客户参考(申报订单号)
customer_ref
=
fields
.
Char
(
string
=
'Customer Ref'
)
# 对应申报订单号
# 内部账号
internal_account_number
=
fields
.
Char
(
string
=
'Internal Account Number'
)
# 用户发货备注
user_track_note
=
fields
.
Char
(
string
=
'User Tracking Note'
)
# 公司代码
company_code
=
fields
.
Char
(
string
=
'Company Code'
)
# 交易单号
trade_no
=
fields
.
Char
(
string
=
'Trade No'
)
# 大包号
big_package_no
=
fields
.
Char
(
string
=
'Big Package No'
,
index
=
True
)
# 海运/铁路的集装箱号
container_no
=
fields
.
Char
(
string
=
'Container No'
)
# 包裹售卖国家编码
buyer_region
=
fields
.
Char
(
string
=
'Package Sell Country Code'
)
# 下一段服务商名称
next_provider_name
=
fields
.
Char
(
string
=
'Next Provider Name'
)
# 发件人姓名
sender_name
=
fields
.
Char
(
string
=
'Sender NAME'
)
# 发件人VAT税号/IOSS NO
sender_vat_no
=
fields
.
Char
(
string
=
'Sender VAT'
)
# 发件人电话
sender_phone
=
fields
.
Char
(
string
=
'Sender PHONE'
)
# 发件人地址1
sender_add_1
=
fields
.
Char
(
string
=
'Sender ADD 1'
)
# 发件人地址2
sender_add_2
=
fields
.
Char
(
string
=
'Sender ADD 2'
)
# 发件人地址3
sender_add_3
=
fields
.
Char
(
string
=
'Sender ADD 3'
)
# 发件人城市
sender_city
=
fields
.
Char
(
string
=
'Sender CITY'
)
# 发件人州
sender_state
=
fields
.
Char
(
string
=
'Sender State'
)
# 发件人邮编
sender_postcode
=
fields
.
Char
(
string
=
'Sender POSTCODE'
)
# 发件人国家
sender_country
=
fields
.
Char
(
string
=
'Sender COUNTRY'
)
# 收件人姓名
receiver_name
=
fields
.
Char
(
string
=
'Receiver NAME'
,
index
=
True
)
# 收件人类型:公司/个人
receiver_type
=
fields
.
Selection
([(
'company'
,
'Company'
),
(
'individual'
,
'Individual'
)],
string
=
'Receiver TYPE'
)
# 收件人VAT税号/IOSS NO
receiver_vat_no
=
fields
.
Char
(
string
=
'Receiver VAT'
)
# 收件人地址1
receiver_add_1
=
fields
.
Char
(
string
=
'Receiver ADD 1'
)
# 收件人地址2
receiver_add_2
=
fields
.
Char
(
string
=
'Receiver ADD 2'
)
# 收件人地址3
receiver_add_3
=
fields
.
Char
(
string
=
'Receiver ADD 3'
)
# 收件人城市
receiver_city
=
fields
.
Char
(
string
=
'Receiver CITY'
)
# 收件人县
receiver_county
=
fields
.
Char
(
string
=
'Receiver COUNTY'
)
receiver_county_translate
=
fields
.
Char
(
string
=
'Receiver COUNTY(EN)'
)
# 收件人邮编
receiver_postcode
=
fields
.
Char
(
string
=
'Receiver POSTCODE'
)
# 收件人邮件
receiver_email
=
fields
.
Char
(
string
=
'Receiver EMAIL'
,
index
=
True
)
# 电话号码
receiver_phone
=
fields
.
Char
(
string
=
'Receiver PHONE'
,
index
=
True
)
# 毛重
gross_weight
=
fields
.
Float
(
string
=
'GROSS WEIGHT'
)
# 重量单位
weight_unit
=
fields
.
Char
(
string
=
'Weight Unit'
)
# 货币
currency
=
fields
.
Char
(
string
=
'Currency'
)
# 币种对象
currency_id
=
fields
.
Many2one
(
'res.currency'
,
string
=
'Currency'
,
index
=
True
)
# 申报价格
total_value
=
fields
.
Float
(
string
=
'Total Value'
)
# 运费
shipping_fee
=
fields
.
Float
(
string
=
'Shipping_fee'
)
# 税的状态
tax_mark
=
fields
.
Selection
(
[(
'TTSTaxed'
,
'TTSTaxed'
),
(
'Sentinel'
,
'Sentinel'
),
(
'LSPTaxed'
,
'LSPTaxed'
),
(
'SellerObligation'
,
'SellerObligation'
)],
string
=
'Tax Mark'
,
index
=
True
)
# 实际缴关税
actual_tax
=
fields
.
Float
(
string
=
'Actual Tax'
)
# 实际缴VAT
actual_vat
=
fields
.
Float
(
string
=
'Actual VAT'
)
# 实缴GST
actual_gst
=
fields
.
Float
(
string
=
'Actual GST'
)
# 实际缴关税币种
actual_tax_currency
=
fields
.
Char
(
string
=
'Actual Tax Currency'
)
# 币种
actual_currency_id
=
fields
.
Many2one
(
'res.currency'
,
string
=
'Currency'
,
index
=
True
)
# 实际缴关税时间
actual_tax_date
=
fields
.
Char
(
string
=
'Actual Tax Date'
)
# 实际缴关税时区
actual_tax_tz
=
fields
.
Char
(
string
=
'Actual Tax Timezone'
)
# 商品明细
good_ids
=
fields
.
One2many
(
'cc.history.package.good'
,
'bl_line_id'
,
string
=
'Goods'
)
# 是否取消
is_cancel
=
fields
.
Boolean
(
string
=
'Is Cancel'
,
default
=
False
)
# 取消原因
cancel_reason
=
fields
.
Char
(
string
=
'Cancel Reason'
)
# 发票附件
invoice_attachment_ids
=
fields
.
Many2many
(
'ir.attachment'
,
relation
=
'history_package_invoice_attachment_rel'
,
string
=
'Invoice Attachments'
)
# 进度状态, 包括已提货、 小包查验、海关放行、小包出库、小包入库、清关失败,包裹交接
state
=
fields
.
Many2one
(
'cc.node'
,
string
=
'Progress state'
,
domain
=
"[('node_type', '=', 'package')]"
,
index
=
True
,
tracking
=
True
,
default
=
lambda
self
:
self
.
env
[
'cc.node'
]
.
search
(
[(
'node_type'
,
'='
,
'package'
),
(
'is_default'
,
'='
,
True
)],
limit
=
1
))
node_exception_reason_id
=
fields
.
Many2one
(
'cc.node.exception.reason'
,
'Exception Reason'
)
process_time
=
fields
.
Datetime
(
'Process Time'
,
index
=
True
)
exception_info_ids
=
fields
.
Many2many
(
'cc.exception.info'
,
'history_package_exception_info_rel'
,
string
=
'Exception Information'
)
# 操作时间RFC3339格式
operation_time
=
fields
.
Char
(
string
=
'Operation Time'
)
# 添加状态说明字段
state_explain
=
fields
.
Text
(
'State Explain'
,
help
=
'State Explain'
)
is_sync
=
fields
.
Boolean
(
'Is Sync'
,
default
=
False
,
index
=
True
)
tk_code
=
fields
.
Char
(
string
=
'TK Code'
,
help
=
'TK Code'
)
# 增加同步日志纪录字段
sync_log_ids
=
fields
.
One2many
(
'cc.history.package.sync.log'
,
'package_id'
,
'Sync Logs'
)
ccs_base/security/ir.model.access.csv
浏览文件 @
e45e94d5
...
@@ -69,3 +69,8 @@ access_cc_clearance_file_ccs_base.group_clearance_of_customs_manager,cc_clearanc
...
@@ -69,3 +69,8 @@ access_cc_clearance_file_ccs_base.group_clearance_of_customs_manager,cc_clearanc
access_cc_clearance_file_ccs_base.group_clearance_of_customs_user,cc_clearance_file ccs_base.group_clearance_of_customs_user,ccs_base.model_cc_clearance_file,ccs_base.group_clearance_of_customs_user,1,0,0,0
access_cc_clearance_file_ccs_base.group_clearance_of_customs_user,cc_clearance_file ccs_base.group_clearance_of_customs_user,ccs_base.model_cc_clearance_file,ccs_base.group_clearance_of_customs_user,1,0,0,0
order_state_change_rule_group_user,order_state_change_rule_group_user,ccs_base.model_order_state_change_rule,base.group_user,1,1,1,1
order_state_change_rule_group_user,order_state_change_rule_group_user,ccs_base.model_order_state_change_rule,base.group_user,1,1,1,1
access_cc_history_big_package_base.group_user,cc_history_big_package base.group_user,ccs_base.model_cc_history_big_package,base.group_user,1,1,1,1
access_cc_history_package_good_base.group_user,cc_history_package_good base.group_user,ccs_base.model_cc_history_package_good,base.group_user,1,1,1,1
access_cc_history_ship_package_base.group_user,cc_history_ship_package base.group_user,ccs_base.model_cc_history_ship_package,base.group_user,1,1,1,1
access_cc_history_package_sync_log_base.group_user,cc_history_package_sync_log base.group_user,ccs_base.model_cc_history_package_sync_log,base.group_user,1,1,1,1
\ No newline at end of file
ccs_base/views/cc_bl_view.xml
浏览文件 @
e45e94d5
...
@@ -106,7 +106,13 @@
...
@@ -106,7 +106,13 @@
</div>
</div>
<widget
name=
"web_ribbon"
bg_color=
"bg-warning"
title=
"Cancelled"
<widget
name=
"web_ribbon"
bg_color=
"bg-warning"
title=
"Cancelled"
attrs=
"{'invisible': [('is_cancel', '=', False)]}"
/>
attrs=
"{'invisible': [('is_cancel', '=', False)]}"
/>
<br/>
<br/>
<br/>
<br/>
<widget
name=
"web_ribbon"
bg_color=
"bg-danger"
title=
"历史提单"
attrs=
"{'invisible': [('is_history', '=', False)]}"
/>
<field
name=
"is_history"
invisible=
"1"
/>
<label
for=
"bl_no"
/>
<label
for=
"bl_no"
/>
<h1>
<h1>
<field
name=
"bl_no"
readonly=
"True"
/>
<field
name=
"bl_no"
readonly=
"True"
/>
...
...
ccs_base/views/cc_history_big_package_view.xml
0 → 100644
浏览文件 @
e45e94d5
差异被折叠。
点击展开。
ccs_base/views/cc_history_package_good_view.xml
0 → 100644
浏览文件 @
e45e94d5
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
# ---------- History Package Good ------------
<record
model=
"ir.ui.view"
id=
"tree_cc_history_package_good_view"
>
<field
name=
"name"
>
tree.cc.history.package.good
</field>
<field
name=
"model"
>
cc.history.package.good
</field>
<field
name=
"arch"
type=
"xml"
>
<tree
string=
"Package Good"
decoration-warning=
"is_cancel==True"
>
<!-- # decoration-muted="opening_debit == 0 and opening_credit == 0" 根据条件显示每行的颜色 muted-->
<field
optional=
"hide"
name=
"item_id"
/>
<field
optional=
"show"
name=
"sku_id"
string=
"SKU ID"
/>
<field
optional=
"show"
name=
"item_name_en"
/>
<field
optional=
"show"
name=
"item_name_cn"
/>
<field
optional=
"hide"
name=
"item_type"
/>
<field
optional=
"hide"
name=
"origin_country"
/>
<field
optional=
"hide"
name=
"freight"
/>
<field
optional=
"hide"
name=
"weight"
/>
<field
optional=
"hide"
name=
"quantity_unit"
/>
<field
optional=
"hide"
name=
"quantity"
/>
<field
optional=
"show"
name=
"item_total_price"
/>
<field
optional=
"hide"
name=
"item_link"
/>
<field
optional=
"hide"
name=
"bl_id"
/>
<field
optional=
"hide"
name=
"bl_line_id"
string=
"Ship Package"
/>
<field
optional=
"hide"
name=
"export_hs_code"
/>
<field
optional=
"hide"
name=
"import_hs_code"
/>
<field
optional=
"hide"
name=
"currency_id"
string=
"Currency"
/>
<field
optional=
"hide"
name=
"cod_amount"
widget=
"monetary"
options=
"{'currency_field': 'currency_id'}"
/>
<field
optional=
"show"
name=
"declare_price"
widget=
"monetary"
options=
"{'currency_field': 'currency_id'}"
/>
<field
optional=
"show"
name=
"item_vat"
string=
"Item VAT"
widget=
"monetary"
options=
"{'currency_field': 'currency_id'}"
/>
<field
optional=
"show"
name=
"vat_rate"
/>
<field
optional=
"hide"
name=
"actual_tax_currency"
/>
<field
optional=
"show"
name=
"actual_gst"
/>
<field
optional=
"hide"
name=
"actual_gst_rate"
/>
<field
optional=
"show"
name=
"actual_tax"
/>
<field
optional=
"hide"
name=
"actual_tax_rate"
/>
<field
optional=
"show"
name=
"actual_vat"
/>
<field
optional=
"hide"
name=
"actual_vat_rate"
/>
<field
optional=
"show"
name=
"item_tax_status"
/>
<field
optional=
"hide"
name=
"is_cancel"
string=
"Cancelled"
/>
</tree>
</field>
</record>
<record
model=
"ir.ui.view"
id=
"form_cc_history_package_good_view"
>
<field
name=
"name"
>
form.cc.history.package.good
</field>
<field
name=
"model"
>
cc.history.package.good
</field>
<field
name=
"arch"
type=
"xml"
>
<form
string=
"Package Good"
>
<header>
<field
name=
"item_tax_status"
widget=
"statusbar"
/>
</header>
<sheet>
<widget
name=
"web_ribbon"
bg_color=
"bg-warning"
title=
"Cancelled"
attrs=
"{'invisible': [('is_cancel', '=', False)]}"
/>
<label
for=
"item_id"
/>
<h1>
<field
name=
"item_id"
/>
</h1>
<group>
<field
name=
"bl_id"
/>
<field
name=
"bl_line_id"
string=
"Ship Package"
/>
<field
name=
"is_cancel"
string=
"Is Cancel"
/>
</group>
<group>
<group
string=
"Base Info"
>
<field
name=
"sku_id"
string=
"SKU ID"
/>
<field
name=
"item_name_en"
/>
<field
name=
"item_name_cn"
/>
<field
name=
"item_type"
/>
<field
name=
"origin_country"
/>
<field
name=
"freight"
/>
<field
name=
"weight"
/>
<field
name=
"quantity_unit"
/>
<field
name=
"quantity"
/>
<field
name=
"item_total_price"
/>
<field
name=
"item_link"
/>
</group>
<group
string=
"CC Info"
>
<field
name=
"export_hs_code"
/>
<field
name=
"import_hs_code"
/>
<field
name=
"currency_id"
string=
"Currency"
/>
<field
name=
"cod_amount"
/>
<field
name=
"declare_price"
/>
<field
name=
"item_vat"
string=
"Item VAT"
/>
<field
name=
"vat_rate"
/>
<field
name=
"actual_gst"
/>
<field
name=
"actual_gst_rate"
/>
<field
name=
"actual_tax"
/>
<field
name=
"actual_tax_currency"
/>
<field
name=
"actual_tax_rate"
/>
<field
name=
"actual_vat"
/>
<field
name=
"actual_vat_rate"
/>
</group>
</group>
<notebook>
</notebook>
</sheet>
</form>
</field>
</record>
<record
model=
"ir.ui.view"
id=
"search_cc_history_package_good_view"
>
<field
name=
"name"
>
search.cc.history.package.good
</field>
<field
name=
"model"
>
cc.history.package.good
</field>
<field
name=
"arch"
type=
"xml"
>
<search
string=
"Package Good"
>
<field
name=
"item_name_en"
string=
"Search"
filter_domain=
"['|', ('item_id', 'ilike', self)'|', ('sku_id', 'ilike', self)'|', ('item_name_en', 'ilike', self), ('item_name_cn', 'ilike', self)]"
/>
<separator/>
<field
name=
"item_id"
/>
<field
name=
"sku_id"
string=
"SKU ID"
/>
<field
name=
"item_name_en"
/>
<field
name=
"item_name_cn"
/>
<field
name=
"item_type"
/>
<field
name=
"origin_country"
/>
<field
name=
"freight"
/>
<field
name=
"weight"
/>
<field
name=
"quantity_unit"
/>
<field
name=
"quantity"
/>
<field
name=
"item_total_price"
/>
<field
name=
"item_link"
/>
<field
name=
"bl_id"
/>
<field
name=
"bl_line_id"
string=
"Ship Package"
/>
<field
name=
"export_hs_code"
/>
<field
name=
"import_hs_code"
/>
<field
name=
"currency_id"
string=
"Currency"
/>
<field
name=
"cod_amount"
/>
<field
name=
"declare_price"
/>
<field
name=
"item_vat"
string=
"Item VAT"
/>
<field
name=
"vat_rate"
/>
<field
name=
"actual_gst"
/>
<field
name=
"actual_gst_rate"
/>
<field
name=
"actual_tax"
/>
<field
name=
"actual_tax_currency"
/>
<field
name=
"actual_tax_rate"
/>
<field
name=
"actual_vat"
/>
<field
name=
"actual_vat_rate"
/>
<field
name=
"item_tax_status"
/>
<separator/>
<separator/>
<group
expand=
"0"
string=
"Group By"
>
<filter
domain=
"[]"
name=
"groupby_item_type"
string=
"Good Type"
context=
"{'group_by': 'item_type'}"
/>
<filter
domain=
"[]"
name=
"groupby_bl_id"
string=
"Bill of Loading"
context=
"{'group_by': 'bl_id'}"
/>
<filter
domain=
"[]"
name=
"groupby_bl_line_id"
string=
"Ship Package"
context=
"{'group_by': 'bl_line_id'}"
/>
<filter
domain=
"[]"
name=
"groupby_currency_id"
string=
"Currency"
context=
"{'group_by': 'currency_id'}"
/>
<filter
domain=
"[]"
name=
"groupby_item_tax_status"
string=
"Tax Status"
context=
"{'group_by': 'item_tax_status'}"
/>
</group>
<searchpanel>
<field
icon=
"fa-users"
select=
"multi"
name=
"item_type"
/>
<field
icon=
"fa-users"
select=
"multi"
name=
"item_tax_status"
/>
</searchpanel>
</search>
</field>
</record>
<record
model=
"ir.actions.act_window"
id=
"action_cc_history_package_good"
>
<field
name=
"name"
>
History Package Good
</field>
<field
name=
"res_model"
>
cc.history.package.good
</field>
<field
name=
"view_mode"
>
tree,form,pivot,graph
</field>
<field
name=
"domain"
>
[]
</field>
<field
name=
"context"
>
{}
</field>
<field
name=
"help"
type=
"html"
>
<p
class=
"o_view_nocontent_smiling_face"
>
[History Package Good] Not yet! Click the Create button in the top left corner and the sofa is yours!
</p>
<p>
</p>
</field>
</record>
</odoo>
\ No newline at end of file
ccs_base/views/cc_history_package_sync_log_view.xml
0 → 100644
浏览文件 @
e45e94d5
<?xml version="1.0" encoding="utf-8"?>
<odoo>
# ---------- CC History Package Sync Log ------------
<record
model=
"ir.ui.view"
id=
"tree_cc_history_package_sync_log_view"
>
<field
name=
"name"
>
tree.cc.history.package.sync.log
</field>
<field
name=
"model"
>
cc.history.package.sync.log
</field>
<field
name=
"arch"
type=
"xml"
>
<tree
string=
"CC History Package Sync Log"
>
<field
optional=
"show"
name=
"package_id"
/>
<field
optional=
"show"
name=
"api_customer"
/>
<field
optional=
"show"
name=
"process_code"
/>
<field
optional=
"show"
name=
"operate_time"
/>
<field
optional=
"show"
name=
"operate_user"
/>
<field
optional=
"show"
name=
"sync_time"
/>
</tree>
</field>
</record>
<record
model=
"ir.ui.view"
id=
"form_cc_history_package_sync_log_view"
>
<field
name=
"name"
>
form.cc.history.package.sync.log
</field>
<field
name=
"model"
>
cc.history.package.sync.log
</field>
<field
name=
"arch"
type=
"xml"
>
<form
string=
"CC History Package Sync Log"
>
<sheet>
<group>
<group>
<field
name=
"package_id"
/>
<field
name=
"api_customer"
/>
<field
name=
"process_code"
/>
<field
name=
"operate_time"
/>
<field
name=
"operate_user"
/>
<field
name=
"sync_time"
/>
</group>
<group>
</group>
</group>
<notebook>
<page
string=
"Operate Remark"
>
<field
name=
"operate_remark"
/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record
model=
"ir.ui.view"
id=
"search_cc_history_package_sync_log_view"
>
<field
name=
"name"
>
search.cc.history.package.sync.log
</field>
<field
name=
"model"
>
cc.history.package.sync.log
</field>
<field
name=
"arch"
type=
"xml"
>
<search
string=
"CC Ship Package Sync Log"
>
<field
name=
"package_id"
/>
<field
name=
"api_customer"
/>
<field
name=
"process_code"
/>
<field
name=
"operate_time"
/>
<field
name=
"operate_user"
/>
<field
name=
"sync_time"
/>
<separator/>
<filter
name=
"filter_operate_time"
string=
"Operate Time"
date=
"operate_time"
/>
<filter
name=
"filter_sync_time"
string=
"Sync Time"
date=
"sync_time"
/>
<separator/>
<group
expand=
"0"
string=
"Group By"
>
<filter
domain=
"[]"
name=
"groupby_package_id"
string=
"Ship Package"
context=
"{'group_by': 'package_id'}"
/>
<filter
domain=
"[]"
name=
"groupby_operate_user"
string=
"Operate User"
context=
"{'group_by': 'operate_user'}"
/>
</group>
</search>
</field>
</record>
<record
model=
"ir.actions.act_window"
id=
"action_cc_history_package_sync_log"
>
<field
name=
"name"
>
CC History Package Sync Log
</field>
<field
name=
"res_model"
>
cc.history.package.sync.log
</field>
<field
name=
"view_mode"
>
tree
</field>
<field
name=
"domain"
>
[]
</field>
<field
name=
"context"
>
{}
</field>
<field
name=
"help"
type=
"html"
>
<p
class=
"o_view_nocontent_smiling_face"
>
[CC History Package Sync Log] Not yet! Click the Create button in the top left corner and the sofa is yours!
</p>
<p>
</p>
</field>
</record>
</odoo>
\ No newline at end of file
ccs_base/views/cc_history_ship_package_view.xml
0 → 100644
浏览文件 @
e45e94d5
差异被折叠。
点击展开。
ccs_base/views/menu_view.xml
浏览文件 @
e45e94d5
...
@@ -51,5 +51,15 @@
...
@@ -51,5 +51,15 @@
<menuitem
sequence=
"20"
name=
"Clearance Company"
id=
"menu_cc_clearance_company"
<menuitem
sequence=
"20"
name=
"Clearance Company"
id=
"menu_cc_clearance_company"
action=
"action_cc_is_clearance_company"
action=
"action_cc_is_clearance_company"
parent=
"menu_ccs_base_main"
/>
parent=
"menu_ccs_base_main"
/>
<menuitem
sequence=
"25"
name=
"History Data"
id=
"menu_cc_history_data"
/>
<menuitem
parent=
"menu_cc_history_data"
sequence=
"1"
name=
"History Big Package"
id=
"menu_cc_history_big_package"
action=
"action_cc_history_big_package"
/>
<menuitem
parent=
"menu_cc_history_data"
sequence=
"5"
name=
"History Package Goods"
id=
"menu_cc_history_package_good"
action=
"action_cc_history_package_good"
/>
<menuitem
parent=
"menu_cc_history_data"
sequence=
"3"
name=
"History Ship Package"
id=
"menu_cc_history_ship_package"
action=
"action_cc_history_ship_package"
/>
</data>
</data>
</odoo>
</odoo>
\ No newline at end of file
consumers/config.py
浏览文件 @
e45e94d5
...
@@ -13,6 +13,14 @@ redis_options = dict(
...
@@ -13,6 +13,14 @@ redis_options = dict(
db
=
0
db
=
0
)
)
postgresql_options
=
dict
(
host
=
"127.0.0.1"
,
port
=
5431
,
database
=
"hh_ccs_test"
,
user
=
"odoo14"
,
password
=
"qq166349"
,
)
# 测试
# 测试
# db_ip = "121.199.167.133"
# db_ip = "121.199.167.133"
# db_port = "8369"
# db_port = "8369"
...
...
consumers/history_data.py
0 → 100644
浏览文件 @
e45e94d5
差异被折叠。
点击展开。
consumers/supervisord_conf/conf.d/history_data.conf
0 → 100644
浏览文件 @
e45e94d5
[
program
:
history_data_consumer_1
]
process_name
=%(
program_name
)
s_
%(
process_num
)
02
d
; 进程名称
directory
= /
mnt
/
extra
-
addons
; 程序的启动目录
command
= /
usr
/
bin
/
python3
/
mnt
/
extra
-
addons
/
history_data
.
py
; 启动命令
autostart
=
true
; 在
supervisord
启动的时候也自动启动
startsecs
=
5
; 启动
5
秒后没有异常退出,就当作已经正常启动了
autorestart
=
true
; 程序异常退出后自动重启
startretries
=
3
; 启动失败自动重试次数,默认是
3
user
=
root
; 用哪个用户启动
numprocs
=
1
; 进程数
redirect_stderr
=
true
; 把
stderr
重定向到
stdout
,默认
false
stdout_logfile_maxbytes
=
20
MB
;
stdout
日志文件大小,默认
50
MB
stdout_logfile_backups
=
20
;
stdout
日志文件备份数
;
stdout
日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(
supervisord
会自动创建日志文件)
stdout_logfile
= /
var
/
log
/
supervisor
/
history_data
.
log
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论